作者 zhl

'init'

正在显示 93 个修改的文件 包含 4567 行增加0 行删除

要显示太多修改。

为保证性能只显示 93 of 93+ 个文件。

  1 +root = true
  2 +
  3 +[*]
  4 +charset = utf-8
  5 +end_of_line = lf
  6 +insert_final_newline = true
  7 +indent_style = space
  8 +indent_size = 4
  9 +trim_trailing_whitespace = true
  10 +
  11 +[*.md]
  12 +trim_trailing_whitespace = false
  13 +
  14 +[*.{yml,yaml}]
  15 +indent_size = 2
  16 +
  17 +[docker-compose.yml]
  18 +indent_size = 4
  1 +APP_NAME=Laravel
  2 +APP_ENV=development
  3 +APP_KEY=base64:+ouoKlz2sFDOisnROMRpxT/u9xkZJVrXlzP4cfTqPow=
  4 +APP_DEBUG=false
  5 +APP_URL=http://localhost
  6 +
  7 +LOG_CHANNEL=stack
  8 +LOG_DEPRECATIONS_CHANNEL=null
  9 +LOG_LEVEL=debug
  10 +
  11 +DB_CONNECTION=mysql
  12 +DB_HOST=127.0.0.1
  13 +DB_PORT=3306F
  14 +DB_DATABASE=globalso
  15 +DB_USERNAME=debian-sys-maint
  16 +DB_PASSWORD=WtujxV73XIclQet0
  17 +
  18 +BROADCAST_DRIVER=log
  19 +CACHE_DRIVER=file
  20 +FILESYSTEM_DRIVER=local
  21 +QUEUE_CONNECTION=sync
  22 +SESSION_DRIVER=file
  23 +SESSION_LIFETIME=120
  24 +
  25 +MEMCACHED_HOST=127.0.0.1
  26 +
  27 +REDIS_HOST=127.0.0.1
  28 +REDIS_PASSWORD=null
  29 +REDIS_PORT=6379
  30 +
  31 +MAIL_MAILER=smtp
  32 +MAIL_HOST=mailhog
  33 +MAIL_PORT=1025
  34 +MAIL_USERNAME=null
  35 +MAIL_PASSWORD=null
  36 +MAIL_ENCRYPTION=null
  37 +MAIL_FROM_ADDRESS=null
  38 +MAIL_FROM_NAME="${APP_NAME}"
  39 +
  40 +AWS_ACCESS_KEY_ID=
  41 +AWS_SECRET_ACCESS_KEY=
  42 +AWS_DEFAULT_REGION=us-east-1
  43 +AWS_BUCKET=
  44 +AWS_USE_PATH_STYLE_ENDPOINT=false
  45 +
  46 +PUSHER_APP_ID=
  47 +PUSHER_APP_KEY=
  48 +PUSHER_APP_SECRET=
  49 +PUSHER_APP_CLUSTER=mt1
  50 +
  51 +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
  52 +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
  1 +APP_NAME=Laravel
  2 +APP_ENV=local
  3 +APP_KEY=base64:+ouoKlz2sFDOisnROMRpxT/u9xkZJVrXlzP4cfTqPow=
  4 +APP_DEBUG=false
  5 +APP_URL=http://localhost
  6 +
  7 +LOG_CHANNEL=stack
  8 +LOG_DEPRECATIONS_CHANNEL=null
  9 +LOG_LEVEL=debug
  10 +
  11 +DB_CONNECTION=mysql
  12 +DB_HOST=127.0.0.1
  13 +DB_PORT=3306
  14 +DB_DATABASE=globalso
  15 +DB_USERNAME=debian-sys-maint
  16 +DB_PASSWORD=WtujxV73XIclQet0
  17 +
  18 +BROADCAST_DRIVER=log
  19 +CACHE_DRIVER=file
  20 +FILESYSTEM_DRIVER=local
  21 +QUEUE_CONNECTION=sync
  22 +SESSION_DRIVER=file
  23 +SESSION_LIFETIME=120
  24 +
  25 +MEMCACHED_HOST=127.0.0.1
  26 +
  27 +REDIS_HOST=127.0.0.1
  28 +REDIS_PASSWORD=null
  29 +REDIS_PORT=6379
  30 +
  31 +MAIL_MAILER=smtp
  32 +MAIL_HOST=mailhog
  33 +MAIL_PORT=1025
  34 +MAIL_USERNAME=null
  35 +MAIL_PASSWORD=null
  36 +MAIL_ENCRYPTION=null
  37 +MAIL_FROM_ADDRESS=null
  38 +MAIL_FROM_NAME="${APP_NAME}"
  39 +
  40 +AWS_ACCESS_KEY_ID=
  41 +AWS_SECRET_ACCESS_KEY=
  42 +AWS_DEFAULT_REGION=us-east-1
  43 +AWS_BUCKET=
  44 +AWS_USE_PATH_STYLE_ENDPOINT=false
  45 +
  46 +PUSHER_APP_ID=
  47 +PUSHER_APP_KEY=
  48 +PUSHER_APP_SECRET=
  49 +PUSHER_APP_CLUSTER=mt1
  50 +
  51 +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
  52 +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
  1 +APP_NAME=Laravel
  2 +APP_ENV=test
  3 +APP_KEY=base64:+ouoKlz2sFDOisnROMRpxT/u9xkZJVrXlzP4cfTqPow=
  4 +APP_DEBUG=false
  5 +APP_URL=http://localhost
  6 +
  7 +LOG_CHANNEL=stack
  8 +LOG_DEPRECATIONS_CHANNEL=null
  9 +LOG_LEVEL=debug
  10 +
  11 +DB_CONNECTION=mysql
  12 +DB_HOST=127.0.0.1
  13 +DB_PORT=3306
  14 +DB_DATABASE=globalso
  15 +DB_USERNAME=debian-sys-maint
  16 +DB_PASSWORD=WtujxV73XIclQet0
  17 +
  18 +BROADCAST_DRIVER=log
  19 +CACHE_DRIVER=file
  20 +FILESYSTEM_DRIVER=local
  21 +QUEUE_CONNECTION=sync
  22 +SESSION_DRIVER=file
  23 +SESSION_LIFETIME=120
  24 +
  25 +MEMCACHED_HOST=127.0.0.1
  26 +
  27 +REDIS_HOST=127.0.0.1
  28 +REDIS_PASSWORD=null
  29 +REDIS_PORT=6379
  30 +
  31 +MAIL_MAILER=smtp
  32 +MAIL_HOST=mailhog
  33 +MAIL_PORT=1025
  34 +MAIL_USERNAME=null
  35 +MAIL_PASSWORD=null
  36 +MAIL_ENCRYPTION=null
  37 +MAIL_FROM_ADDRESS=null
  38 +MAIL_FROM_NAME="${APP_NAME}"
  39 +
  40 +AWS_ACCESS_KEY_ID=
  41 +AWS_SECRET_ACCESS_KEY=
  42 +AWS_DEFAULT_REGION=us-east-1
  43 +AWS_BUCKET=
  44 +AWS_USE_PATH_STYLE_ENDPOINT=false
  45 +
  46 +PUSHER_APP_ID=
  47 +PUSHER_APP_KEY=
  48 +PUSHER_APP_SECRET=
  49 +PUSHER_APP_CLUSTER=mt1
  50 +
  51 +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
  52 +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
  1 +* text=auto
  2 +
  3 +*.blade.php diff=html
  4 +*.css diff=css
  5 +*.html diff=html
  6 +*.md diff=markdown
  7 +*.php diff=php
  8 +
  9 +/.github export-ignore
  10 +CHANGELOG.md export-ignore
  1 +/node_modules
  2 +/public/hot
  3 +/public/storage
  4 +/storage/*.key
  5 +/vendor
  6 +.env
  7 +.env.backup
  8 +.phpunit.result.cache
  9 +docker-compose.override.yml
  10 +Homestead.json
  11 +Homestead.yaml
  12 +npm-debug.log
  13 +yarn-error.log
  14 +/.idea
  15 +/.vscode
  1 +php:
  2 + preset: laravel
  3 + version: 8
  4 + disabled:
  5 + - no_unused_imports
  6 + finder:
  7 + not-name:
  8 + - index.php
  9 + - server.php
  10 +js:
  11 + finder:
  12 + not-name:
  13 + - webpack.mix.js
  14 +css: true
  1 +# 基础框架 - 后端管理系统
  2 +## 路由
  3 +### 路由提供者Provider中预定义两个路由
  4 +- bside 代表B端用户访问路由 完整路由:{{url}}/a/xxx
  5 +- aside 代表管理员访问路由 完整路由:{{url}}/b/xxx
  6 +
  7 +## 枚举
  8 +### 使用插件bensampo/laravel-enum 版本4 github地址:https://github.com/BenSampo/laravel-enum/blob/v4.2.0/README.md
  9 +- 创建枚举类 : php artisan make:enum ”文件名“
  10 +- 给枚举类生成注释: php artisan enum:annotate "文件名"
  11 +- 如有翻译本地化需求,在 resources/lang/zh-CN/enums.php文件中中文翻译,英文语言包不用写,会自动翻译键名
  12 +- 在验证器中使用 : '参数名' => ['required ', new EnumValue(CaptchaType::class)],(或者按照键名new EnumKey)
  13 +- 可参考Enums/Common/Common.php枚举类
  14 +
  15 +## 状态码
  16 +- 该系统所有状态码都定义在 App\Enums\Commom\Code枚举类中
  17 +- 大大类 和 大类不能变动 ,以大类为基准步长为100,根据业务自定义状态码
  18 +
  19 +## 中间件
  20 +- 登录验证中间件 ”loginauth“
  21 +- Bside路由默认已经使用的中间件组为bside
  22 +- Aside路由默认已经使用的中间件组为aside
  23 +
  24 +## 参数加密
  25 +- .env文件中有三个配置,其中iv必须是八位
  26 +- 参数加密不开启的时候,前端正常传入参数,是明文不安全
  27 +
  28 +
  29 +## 控制器
  30 +- 各个端控制器目录:App\Http\Controllers\XXXside
  31 +- BaseController基础控制器,需要被其他控制器继承
  32 +- 控制器中只需要干三件事情:
  33 + 第一,验证参数(如果注入了自定义验证Request就可以省略$request->validate这一步)
  34 + 第二,调用逻辑层Logic
  35 + 第三,success返回---错误直接走异常处理
  36 +
  37 +## 请求and响应
  38 +- 控制器方法注入请求Illuminate\Http\Request或者注入自定义请求表单
  39 +- 创建请求表单: php artisan make:request 文件名
  40 +- 请求表单中定义,用户是否有权限请求以及参数验证规则
  41 +- 控制器中调用request->validated()
  42 +- 响应只能调用BaseController的success()方法
  43 +> 注意!全站返回不能编写自定义的message,只能通过Code码
  44 +
  45 +## 逻辑层
  46 +- App\Http\Logic逻辑层只能被控制器调用
  47 +- 要继承基类BaseLogic,return 使用基类定义的方法
  48 +## 错误截获
  49 +- 自定义某端全局异常:App\Exceptions\XXXsideGlobalException,throw new XXXsideGlobalException($code); 注意也只能传入Code码
  50 +
  51 +> 注意!.env文件APP_DEBUG控制是否显示详细错误信息,否则就按照本地化的错误码的message来显示
  52 +
  53 +## 日志规范
  54 +- 配置文件logging.php中预定义了B端错误日志bside
  55 +- 日志格式:logs -> bside(端)-> 2022-06(年月)-> 日期_级别.log (预定义了两个级别 errors和info)
  56 +- errors错误日志会在异常抛出的时候自动记录,info手动调用
  57 +- 共工具类App\Utils\LogUtils 提供了两个方法errorBside,infoBside记录日志
  58 +
  59 +## 数据迁移
  60 +- 每个版本的迭代如有数据结构修改,必须写到数据迁移里面
  61 +- 创建迁移 :php artisan make:migration create_users_table --create=users 或者 php artisan make:migration
  62 + add_votes_to_users_table --table=users (--create是创建表 --table是编辑表)
  63 +- 编写迁移脚本
  64 +- 执行迁移: php artisan migrate
  65 +
  66 +## 数据填充
  67 +- 每个版本的迭代如有数据预设置,必须写到数据填充里面
  68 +- 创建填充 : php artisan make:seeder 文件名
  69 +- 如果是简单的直接在seeder文件的run()方法中写insert
  70 +- 如果较复杂需要编写模型工厂:php artisan make:factory UserFactory
  71 +- 执行填充 : composer dump-autoload (用来重新生成composer映射) ,php artisan db:seed
  72 +
  73 +## Redis
  74 +- 配置文件database.php中的redis
  75 +- 所有使用到的键名需要在枚举类中定义:App\Enums\Common\RedisKey
  76 +- 工具类App\Utils\RedisUtils中提供了获取redis实例的方法
  77 +- traits文件App\Traits\RedisTraits中,定义了常用的redis方法,使用的时候只需要: use RedisTrait;
  1 +<?php
  2 +
  3 +namespace App\Console;
  4 +
  5 +use Illuminate\Console\Scheduling\Schedule;
  6 +use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
  7 +
  8 +class Kernel extends ConsoleKernel
  9 +{
  10 + /**
  11 + * Define the application's command schedule.
  12 + *
  13 + * @param \Illuminate\Console\Scheduling\Schedule $schedule
  14 + * @return void
  15 + */
  16 + protected function schedule(Schedule $schedule)
  17 + {
  18 + // $schedule->command('inspire')->hourly();
  19 + }
  20 +
  21 + /**
  22 + * Register the commands for the application.
  23 + *
  24 + * @return void
  25 + */
  26 + protected function commands()
  27 + {
  28 + $this->load(__DIR__.'/Commands');
  29 +
  30 + require base_path('routes/console.php');
  31 + }
  32 +}
  1 +<?php
  2 +
  3 +namespace App\Enums\Common;
  4 +
  5 +use BenSampo\Enum\Contracts\LocalizedEnum;
  6 +use BenSampo\Enum\Enum;
  7 +
  8 +/**
  9 + * 状态码类
  10 + * @method static static SUCCESS()
  11 + * @method static static USER_ERROR()
  12 + * @method static static USER_REGISTER_ERROE()
  13 + * @method static static USER_LOGIN_ERROE()
  14 + * @method static static USER_PERMISSION_ERROE()
  15 + * @method static static USER_PARAMS_ERROE()
  16 + * @method static static USER_UPLOAD_ERROE()
  17 + * @method static static USER_VERSION_ERROE()
  18 + * @method static static SYSTEM_ERROR()
  19 + * @method static static SYSTEM_TIMEOUT_ERROR()
  20 + * @method static static SERVER_ERROR()
  21 + * @method static static SERVER_MYSQL_ERROR()
  22 + * @method static static SERVER_REDIS_ERROR()
  23 + * @method static static USER_MODEL_NOTFOUND_ERROE()
  24 + */
  25 +final class Code extends Enum implements LocalizedEnum
  26 +{
  27 + //成功
  28 + const SUCCESS = "00000";
  29 +
  30 + //用户行为大大类
  31 + const USER_ERROR = "A0001";
  32 + //用户注册错误大类
  33 + const USER_REGISTER_ERROE = "A0100";
  34 + //用户登陆错误大类
  35 + const USER_LOGIN_ERROE = "A0200";
  36 +
  37 + //用户权限错误大类
  38 + const USER_PERMISSION_ERROE = 'A0300';
  39 +
  40 + //用户请求参数错误大类
  41 + const USER_PARAMS_ERROE = 'A0400';
  42 + //模型资源未找到
  43 + const USER_MODEL_NOTFOUND_ERROE = 'A0402';
  44 +
  45 + //用户上传异常大类
  46 + const USER_UPLOAD_ERROE = 'A0500';
  47 +
  48 + //用户版本异常大类
  49 + const USER_VERSION_ERROE = 'A0600';
  50 +
  51 + //用户不安全操作大类
  52 + const USER_UNSAFE_OPERATION = 'A0700';
  53 + //用户重复快速点击错误
  54 + const USER_REPEAT_QUIT_CALL = 'A0701';
  55 +
  56 + //系统出错大大类
  57 + const SYSTEM_ERROR = "B0001";
  58 + //系统执行超时大类
  59 + const SYSTEM_TIMEOUT_ERROR = "B0100";
  60 +
  61 + //调用外部服务出错
  62 + const SERVER_ERROR = "C0001";
  63 + //mysql服务出错
  64 + const SERVER_MYSQL_ERROR = "C0100";
  65 + //redis服务出错
  66 + const SERVER_REDIS_ERROR = "C0200";
  67 +
  68 +
  69 +}
  1 +<?php
  2 +
  3 +namespace App\Enums\Common;
  4 +
  5 +use BenSampo\Enum\Enum;
  6 +
  7 +/**
  8 + * 共用枚举类
  9 + * @method static static YES()
  10 + * @method static static NO()
  11 + */
  12 +final class Common extends Enum
  13 +{
  14 + //公用 : 是和否 1-是 2-否
  15 + const YES = 1;
  16 + const NO = 2;
  17 +
  18 + //端
  19 + const A='a';
  20 + const B='b';
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Enums\Common;
  4 +
  5 +use BenSampo\Enum\Enum;
  6 +
  7 +/**
  8 + * 测试枚举类---关于参数验证等用法
  9 + * @method static static OptionOne()
  10 + * @method static static OptionTwo()
  11 + * @method static static OptionThree()
  12 + */
  13 +final class Demo extends Enum
  14 +{
  15 + const OptionOne = 0;
  16 + const OptionTwo = 1;
  17 + const OptionThree = 2;
  18 +}
  1 +<?php
  2 +
  3 +namespace App\Enums\Common;
  4 +
  5 +use BenSampo\Enum\Enum;
  6 +
  7 +/**
  8 + * 所有Redis键名
  9 + * @method static static TESTKEY()
  10 + */
  11 +final class RedisKey extends Enum
  12 +{
  13 + //用户登录 token集合(多点登录) set
  14 + const USER_TOKEN = 'user_token:';
  15 + //token对应的用户信息
  16 + const USER_LOGIN = 'user_login_info:';
  17 + const DING_MSG = 'ding_msg:';
  18 +}
  1 +<?php
  2 +
  3 +namespace App\Exceptions;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use Exception;
  7 +use Throwable;
  8 +
  9 +/**
  10 + * @notes: B端接口统一错误格式
  11 + * @author:wlj
  12 + * @date: 2022/6/2 16:32
  13 + */
  14 +class AsideGlobalException extends Exception
  15 +{
  16 + public function __construct($code = 0, $message = "", Throwable $previous = null)
  17 + {
  18 + $this->code = $code;
  19 + $this->message = $message;
  20 + if (empty($this->message)) {
  21 + $this->message = Code::fromValue($code)->description;
  22 + }
  23 + }
  24 +}
  1 +<?php
  2 +
  3 +namespace App\Exceptions;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use Exception;
  7 +use Throwable;
  8 +
  9 +/**
  10 + * @notes: B端接口统一错误格式
  11 + * @author:wlj
  12 + * @date: 2022/6/2 16:32
  13 + */
  14 +class BsideGlobalException extends Exception
  15 +{
  16 + public function __construct($code = 0, $message = "", Throwable $previous = null)
  17 + {
  18 + $this->code = $code;
  19 + $this->message = $message;
  20 + if (empty($this->message)) {
  21 + $this->message = Code::fromValue($code)->description;
  22 + }
  23 + }
  24 +}
  1 +<?php
  2 +
  3 +namespace App\Exceptions;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use App\Enums\Common\Common;
  7 +use App\Services\DingService;
  8 +use App\Utils\EncryptUtils;
  9 +use App\Utils\LogUtils;
  10 +use Illuminate\Database\Eloquent\ModelNotFoundException;
  11 +use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
  12 +use Illuminate\Support\Facades\Route;
  13 +use Illuminate\Validation\ValidationException;
  14 +use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
  15 +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  16 +use Throwable;
  17 +
  18 +class Handler extends ExceptionHandler
  19 +{
  20 + /**
  21 + * A list of the exception types that are not reported.
  22 + *
  23 + * @var array<int, class-string<Throwable>>
  24 + */
  25 + protected $dontReport = [
  26 + //
  27 + ];
  28 +
  29 + /**
  30 + * A list of the inputs that are never flashed for validation exceptions.
  31 + *
  32 + * @var array<int, string>
  33 + */
  34 + protected $dontFlash = [
  35 + 'current_password',
  36 + 'password',
  37 + 'password_confirmation',
  38 + ];
  39 +
  40 + /**
  41 + * Register the exception handling callbacks for the application.
  42 + *
  43 + * @return void
  44 + */
  45 + public function register()
  46 + {
  47 + $this->reportable(function (Throwable $e) {
  48 + //
  49 + });
  50 + }
  51 + /**
  52 + * Report or log an exception.
  53 + *
  54 + * @param \Throwable $exception
  55 + * @return void
  56 + *
  57 + * @throws \Throwable
  58 + */
  59 + public function report(Throwable $exception)
  60 + {
  61 +
  62 + //日志记录
  63 + $exceptionMessage = "错误CODE:" . $exception->getCode() .
  64 + "-----错误message:" . $exception->getMessage() .
  65 + '------错误文件:' . $exception->getFile() .
  66 + '-------错误行数:' . $exception->getLine();
  67 + //A端错误
  68 + if ($exception instanceof AsideGlobalException) {
  69 + LogUtils::error("AsideGlobalException", [], $exceptionMessage);
  70 + }
  71 + //B端错误
  72 + elseif($exception instanceof BsideGlobalException) {
  73 + LogUtils::error("BsideGlobalException", [], $exceptionMessage);
  74 + }
  75 + //验证错误(非手动抛出)
  76 + elseif ($exception instanceof ValidationException) {
  77 + LogUtils::error("参数验证失败", [], $exceptionMessage);
  78 + }
  79 + //Redis错误(非手动抛出)
  80 + elseif ($exception instanceof \RedisException) {
  81 + LogUtils::error("Redis服务异常", [], $exceptionMessage);
  82 + }
  83 + //Mysql错误(非手动抛出)
  84 + elseif ($exception instanceof \PDOException) {
  85 + LogUtils::error("数据库服务异常", [], $exceptionMessage);
  86 + }
  87 + //模型未找到错误(非手动抛出)
  88 + elseif ($exception instanceof ModelNotFoundException) {
  89 + LogUtils::error("模型资源未找到", [], $exceptionMessage);
  90 + }
  91 + //其他
  92 + else {
  93 + LogUtils::error("全局系统异常", [], $exceptionMessage);
  94 + }
  95 + }
  96 + /**
  97 + * Render an exception into an HTTP response.
  98 + *
  99 + * @param \Illuminate\Http\Request $request
  100 + * @param \Throwable $exception
  101 + * @return \Symfony\Component\HttpFoundation\Response
  102 + *
  103 + * @throws \Throwable
  104 + */
  105 + public function render($request, Throwable $exception)
  106 + {
  107 + $message = $exception->getMessage();
  108 +
  109 + if ($exception instanceof AsideGlobalException) {
  110 + $code = $exception->getCode();
  111 + }elseif ($exception instanceof BsideGlobalException) {
  112 + $code = $exception->getCode();
  113 + } elseif ($exception instanceof ValidationException) {
  114 + $code = Code::USER_PARAMS_ERROE();
  115 + } elseif ($exception instanceof \RedisException) {
  116 + $code = Code::SERVER_REDIS_ERROR();
  117 + } elseif ($exception instanceof \PDOException) {
  118 + $code = Code::SERVER_MYSQL_ERROR();
  119 + } elseif ($exception instanceof ModelNotFoundException) {
  120 + $code = Code::USER_MODEL_NOTFOUND_ERROE();
  121 + } elseif ($exception instanceof NotFoundHttpException || $exception instanceof MethodNotAllowedHttpException) {
  122 + return response('404 Not Found', 404);
  123 + } else {
  124 + $code = Code::SYSTEM_ERROR();
  125 + }
  126 + //钉钉通知错误信息
  127 + if (in_array(config('app.env'), ['test', 'production']) && (in_array(substr($code, 0, 1), ['B', 'C']))) {
  128 + $exceptionMessage = "路由:" . Route::current()->uri .
  129 + "-----错误CODE:" . $exception->getCode() .
  130 + "-----错误message:" . $exception->getMessage() .
  131 + '------错误文件:' . $exception->getFile() . '-------错误行数:' .
  132 + $exception->getLine();
  133 + (new DingService())->handle(['keyword' => "ERROR", 'msg' => config('app.env') . '环境报错:' . $exceptionMessage, 'isAtAll' => false]);
  134 + }
  135 + //开启debug 错误原样输出
  136 + $debub = config('app.debug');
  137 + $message = $debub ? $message : ($code->description ?? $message);
  138 + $response = [
  139 + 'code' => $code,
  140 + 'message' => $message
  141 + ];
  142 + //加密返回
  143 + if (config('app.params_encrypt')) {
  144 + $k = config('app.params_encrypt_key');
  145 + $i = config('app.params_encrypt_iv');
  146 + $response = [
  147 + 'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
  148 + }
  149 + return response($response);
  150 + }
  151 +}
  1 +<?php
  2 +/**
  3 + * @author:wlj
  4 + * @date: 2022/6/7 16:49
  5 + */
  6 +
  7 +namespace App\Factory;
  8 +
  9 +use Monolog\Formatter\LineFormatter;
  10 +use Monolog\Handler\StreamHandler;
  11 +use Monolog\Logger;
  12 +
  13 +class LogFormatterFactory
  14 +{
  15 + /**
  16 + * 实现日志工厂
  17 + *
  18 + * @param array $config /config/logging.php 当前频道的配置
  19 + * @return \Monolog\Logger
  20 + */
  21 + public function __invoke(array $config)
  22 + {
  23 + return new Logger('', [
  24 + $this->create($config, Logger::ERROR, 'errors'),
  25 + $this->create($config, Logger::INFO, 'info'),
  26 + ]);
  27 + }
  28 +
  29 + private function create($config, $level, $suffix = '')
  30 + {
  31 + $time = time();
  32 + $path = date('Y-m', $time) . '/' . date('d', $time) . '_' . $suffix . '.log';
  33 + $path = 'logs/' . $config['prefix'] . '/' . $path;
  34 + $path = storage_path($path);
  35 + $handler = new StreamHandler($path, $level, false);
  36 + $handler->setFormatter(new LineFormatter(null, 'Y-m-d H:i:s', false, true));
  37 + return $handler;
  38 + }
  39 +
  40 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers\Aside;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use App\Http\Controllers\Controller;
  7 +use App\Utils\EncryptUtils;
  8 +use Illuminate\Http\JsonResponse;
  9 +
  10 +class BaseController extends Controller
  11 +{
  12 + /**
  13 + * 成功返回
  14 + * @param array $data
  15 + * @param string $code
  16 + * @param bool $objectData
  17 + * @return JsonResponse
  18 + * @throws \Psr\Container\ContainerExceptionInterface
  19 + * @throws \Psr\Container\NotFoundExceptionInterface
  20 + */
  21 + function success(array $data = [], string $code = Code::SUCCESS, bool $objectData = false): JsonResponse
  22 + {
  23 + if ($objectData) {
  24 + $data = (object)$data;
  25 + }
  26 + $code = Code::fromValue($code);
  27 + $response = [
  28 + 'code' => $code->value,
  29 + 'data' => $data,
  30 + 'msg' => $code->description,
  31 + ];
  32 + //加密-返回数据
  33 + if (config('app.params_encrypt')) {
  34 + $k = config('app.params_encrypt_key');
  35 + $i = config('app.params_encrypt_iv');
  36 + $response = [
  37 + 'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
  38 + }
  39 + return response()->json($response);
  40 + }
  41 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers\Aside;
  4 +
  5 +use App\Http\Logic\Aside\DemoLogic;
  6 +use App\Http\Requests\Aside\DemoRequest;
  7 +
  8 +class DemoController extends BaseController
  9 +{
  10 + /**
  11 + * Deom控制器
  12 + * @param DemoRequest $request
  13 + * @param DemoLogic $logic
  14 + * @return \Illuminate\Http\JsonResponse
  15 + * @throws \Psr\Container\ContainerExceptionInterface
  16 + * @throws \Psr\Container\NotFoundExceptionInterface
  17 + */
  18 + public function test(DemoRequest $request,DemoLogic $logic)
  19 + {
  20 + $request->validated();
  21 + $data=$logic->testLogic();
  22 + return $this->success($data);
  23 + }
  24 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers\Bside;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use App\Http\Controllers\Controller;
  7 +use App\Utils\EncryptUtils;
  8 +use Illuminate\Http\JsonResponse;
  9 +
  10 +class BaseController extends Controller
  11 +{
  12 + /**
  13 + * 成功返回
  14 + * @param array $data
  15 + * @param string $code
  16 + * @param bool $objectData
  17 + * @return JsonResponse
  18 + * @throws \Psr\Container\ContainerExceptionInterface
  19 + * @throws \Psr\Container\NotFoundExceptionInterface
  20 + */
  21 + function success(array $data = [], string $code = Code::SUCCESS, bool $objectData = false): JsonResponse
  22 + {
  23 + if ($objectData) {
  24 + $data = (object)$data;
  25 + }
  26 + $code = Code::fromValue($code);
  27 + $response = [
  28 + 'code' => $code->value,
  29 + 'data' => $data,
  30 + 'msg' => $code->description,
  31 + ];
  32 + //加密-返回数据
  33 + if (config('app.params_encrypt')) {
  34 + $k = config('app.params_encrypt_key');
  35 + $i = config('app.params_encrypt_iv');
  36 + $response = [
  37 + 'p' => (new EncryptUtils())->openssl_en($response, $k, $i)];
  38 + }
  39 + return response()->json($response);
  40 + }
  41 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Controllers;
  4 +
  5 +use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
  6 +use Illuminate\Foundation\Bus\DispatchesJobs;
  7 +use Illuminate\Foundation\Validation\ValidatesRequests;
  8 +use Illuminate\Routing\Controller as BaseController;
  9 +
  10 +class Controller extends BaseController
  11 +{
  12 + use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
  13 +}
  1 +<?php
  2 +
  3 +namespace App\Http;
  4 +
  5 +use App\Http\Middleware\Aside\BlackListMiddleware as AsideBlackListMiddleware;
  6 +use App\Http\Middleware\Aside\ParamMiddleware as AsideParamMiddleware;
  7 +use App\Http\Middleware\Bside\BlackListMiddleware as BsideBlackListMiddleware;
  8 +use App\Http\Middleware\Bside\ParamMiddleware as BsideParamMiddleware;
  9 +use App\Http\Middleware\Aside\LoginAuthMiddleware as AsideLoginAuthMiddleware;
  10 +use App\Http\Middleware\Bside\LoginAuthMiddleware as BsideLoginAuthMiddleware;
  11 +use App\Http\Middleware\PreventRepeatQuitCallMiddleware;
  12 +use Illuminate\Foundation\Http\Kernel as HttpKernel;
  13 +
  14 +class Kernel extends HttpKernel
  15 +{
  16 + /**
  17 + * The application's global HTTP middleware stack.
  18 + *
  19 + * These middleware are run during every request to your application.
  20 + *
  21 + * @var array<int, class-string|string>
  22 + */
  23 + protected $middleware = [
  24 + // \App\Http\Middleware\TrustHosts::class,
  25 + \App\Http\Middleware\TrustProxies::class,
  26 + \Fruitcake\Cors\HandleCors::class,
  27 + \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
  28 + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
  29 + \App\Http\Middleware\TrimStrings::class,
  30 + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
  31 + ];
  32 +
  33 + /**
  34 + * The application's route middleware groups.
  35 + *
  36 + * @var array<string, array<int, class-string|string>>
  37 + */
  38 + protected $middlewareGroups = [
  39 + 'web' => [
  40 + \App\Http\Middleware\EncryptCookies::class,
  41 + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  42 + \Illuminate\Session\Middleware\StartSession::class,
  43 + // \Illuminate\Session\Middleware\AuthenticateSession::class,
  44 + \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  45 + \App\Http\Middleware\VerifyCsrfToken::class,
  46 + \Illuminate\Routing\Middleware\SubstituteBindings::class,
  47 + ],
  48 +
  49 + 'api' => [
  50 + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  51 + 'throttle:api',
  52 + \Illuminate\Routing\Middleware\SubstituteBindings::class,
  53 + ],
  54 + //A端中间件组
  55 + 'aside'=>[
  56 + //参数处理中间件--涉及-参数记录-参数加解密等
  57 + AsideParamMiddleware::class,
  58 + //黑名单处理中间件
  59 + AsideBlackListMiddleware::class,
  60 + //防重复调用接口
  61 + PreventRepeatQuitCallMiddleware::class
  62 + ],
  63 + //B端中间件组
  64 + 'bside'=>[
  65 + //参数处理中间件--涉及-参数记录-参数加解密等
  66 + BsideParamMiddleware::class,
  67 + //黑名单处理中间件
  68 + BsideBlackListMiddleware::class,
  69 + //防重复调用接口
  70 + PreventRepeatQuitCallMiddleware::class
  71 + ]
  72 + ];
  73 +
  74 + /**
  75 + * The application's route middleware.
  76 + *
  77 + * These middleware may be assigned to groups or used individually.
  78 + *
  79 + * @var array<string, class-string|string>
  80 + */
  81 + protected $routeMiddleware = [
  82 + 'auth' => \App\Http\Middleware\Authenticate::class,
  83 + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  84 + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
  85 + 'can' => \Illuminate\Auth\Middleware\Authorize::class,
  86 + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  87 + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
  88 + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
  89 + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  90 + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
  91 + //A端登录验证中间件
  92 + 'aloginauth'=>AsideLoginAuthMiddleware::class,
  93 + //B端登录验证中间件
  94 + 'bloginauth'=>BsideLoginAuthMiddleware::class
  95 + ];
  96 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Logic\Aside;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use App\Exceptions\AsideGlobalException;
  7 +
  8 +/**
  9 + * @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
  10 + * @author:wlj
  11 + * @date: 2022/6/7 17:37
  12 + */
  13 +class BaseLogic
  14 +{
  15 + /**
  16 + * @notes: 请简要描述方法功能
  17 + * @param array $data
  18 + * @return array
  19 + * @author:wlj
  20 + * @date: 2022/7/19 12:25
  21 + */
  22 + public function success(array $data): array
  23 + {
  24 + return $data;
  25 + }
  26 +
  27 + /**
  28 + * @notes: 错误抛出
  29 + * @param string $code
  30 + * @param string $message
  31 + * @throws AsideGlobalException
  32 + * @author:wlj
  33 + * @date: 2022/7/19 12:28
  34 + */
  35 + public function fail(string $code = Code::SYSTEM_ERROR, $message = "")
  36 + {
  37 + throw new AsideGlobalException($code, $message);
  38 + }
  39 +
  40 + /**
  41 + * @notes: 统一格式化分页返回
  42 + * @return array
  43 + * @author:wlj
  44 + * @date: 2022/7/11 15:34
  45 + */
  46 + function getPageData($pagninate): array
  47 + {
  48 + $p = $pagninate->toArray();
  49 + $result['list'] = $p ['data'];
  50 + $result['pager']['total'] = $p ['total'];
  51 + $result['pager']['page'] = $p ['current_page'];
  52 + $result['pager']['pagesize'] = $p ['per_page'];
  53 +
  54 + return $result;
  55 + }
  56 +
  57 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Logic\Aside;
  4 +
  5 +class DemoLogic extends BaseLogic
  6 +{
  7 + protected $requestAll;
  8 + public function __construct()
  9 + {
  10 + $this->requestAll=request()->all();
  11 + }
  12 + public function testLogic():array
  13 + {
  14 + return $this->success($this->requestAll);
  15 + }
  16 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Logic\Bside;
  4 +
  5 +use App\Enums\Common\Code;
  6 +use App\Exceptions\BsideGlobalException;
  7 +
  8 +/**
  9 + * @notes: 逻辑层基类 控制器调用 统一返回 统一抛出异常
  10 + * @author:wlj
  11 + * @date: 2022/6/7 17:37
  12 + */
  13 +class BaseLogic
  14 +{
  15 + /**
  16 + * @notes: 请简要描述方法功能
  17 + * @param array $data
  18 + * @return array
  19 + * @author:wlj
  20 + * @date: 2022/7/19 12:25
  21 + */
  22 + public function success(array $data): array
  23 + {
  24 + return $data;
  25 + }
  26 +
  27 + /**
  28 + * @notes: 错误抛出
  29 + * @param string $code
  30 + * @param string $message
  31 + * @throws BsideGlobalException
  32 + * @author:wlj
  33 + * @date: 2022/7/19 12:28
  34 + */
  35 + public function fail(string $code = Code::SYSTEM_ERROR, $message = "")
  36 + {
  37 + throw new BsideGlobalException($code, $message);
  38 + }
  39 +
  40 + /**
  41 + * @notes: 统一格式化分页返回
  42 + * @return array
  43 + * @author:wlj
  44 + * @date: 2022/7/11 15:34
  45 + */
  46 + function getPageData($pagninate): array
  47 + {
  48 + $p = $pagninate->toArray();
  49 + $result['list'] = $p ['data'];
  50 + $result['pager']['total'] = $p ['total'];
  51 + $result['pager']['page'] = $p ['current_page'];
  52 + $result['pager']['pagesize'] = $p ['per_page'];
  53 +
  54 + return $result;
  55 + }
  56 +
  57 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Aside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class BlackListMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Aside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class LoginAuthMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Aside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class ParamMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Auth\Middleware\Authenticate as Middleware;
  6 +
  7 +class Authenticate extends Middleware
  8 +{
  9 + /**
  10 + * Get the path the user should be redirected to when they are not authenticated.
  11 + *
  12 + * @param \Illuminate\Http\Request $request
  13 + * @return string|null
  14 + */
  15 + protected function redirectTo($request)
  16 + {
  17 + if (! $request->expectsJson()) {
  18 + return route('login');
  19 + }
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Bside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class BlackListMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Bside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class LoginAuthMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware\Bside;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class ParamMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
  6 +
  7 +class EncryptCookies extends Middleware
  8 +{
  9 + /**
  10 + * The names of the cookies that should not be encrypted.
  11 + *
  12 + * @var array<int, string>
  13 + */
  14 + protected $except = [
  15 + //
  16 + ];
  17 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Closure;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class PreventRepeatQuitCallMiddleware
  9 +{
  10 + /**
  11 + * Handle an incoming request.
  12 + *
  13 + * @param \Illuminate\Http\Request $request
  14 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  15 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  16 + */
  17 + public function handle(Request $request, Closure $next)
  18 + {
  19 + return $next($request);
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
  6 +
  7 +class PreventRequestsDuringMaintenance extends Middleware
  8 +{
  9 + /**
  10 + * The URIs that should be reachable while maintenance mode is enabled.
  11 + *
  12 + * @var array<int, string>
  13 + */
  14 + protected $except = [
  15 + //
  16 + ];
  17 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use App\Providers\RouteServiceProvider;
  6 +use Closure;
  7 +use Illuminate\Http\Request;
  8 +use Illuminate\Support\Facades\Auth;
  9 +
  10 +class RedirectIfAuthenticated
  11 +{
  12 + /**
  13 + * Handle an incoming request.
  14 + *
  15 + * @param \Illuminate\Http\Request $request
  16 + * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  17 + * @param string|null ...$guards
  18 + * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  19 + */
  20 + public function handle(Request $request, Closure $next, ...$guards)
  21 + {
  22 + $guards = empty($guards) ? [null] : $guards;
  23 +
  24 + foreach ($guards as $guard) {
  25 + if (Auth::guard($guard)->check()) {
  26 + return redirect(RouteServiceProvider::HOME);
  27 + }
  28 + }
  29 +
  30 + return $next($request);
  31 + }
  32 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
  6 +
  7 +class TrimStrings extends Middleware
  8 +{
  9 + /**
  10 + * The names of the attributes that should not be trimmed.
  11 + *
  12 + * @var array<int, string>
  13 + */
  14 + protected $except = [
  15 + 'current_password',
  16 + 'password',
  17 + 'password_confirmation',
  18 + ];
  19 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Http\Middleware\TrustHosts as Middleware;
  6 +
  7 +class TrustHosts extends Middleware
  8 +{
  9 + /**
  10 + * Get the host patterns that should be trusted.
  11 + *
  12 + * @return array<int, string|null>
  13 + */
  14 + public function hosts()
  15 + {
  16 + return [
  17 + $this->allSubdomainsOfApplicationUrl(),
  18 + ];
  19 + }
  20 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Http\Middleware\TrustProxies as Middleware;
  6 +use Illuminate\Http\Request;
  7 +
  8 +class TrustProxies extends Middleware
  9 +{
  10 + /**
  11 + * The trusted proxies for this application.
  12 + *
  13 + * @var array<int, string>|string|null
  14 + */
  15 + protected $proxies;
  16 +
  17 + /**
  18 + * The headers that should be used to detect proxies.
  19 + *
  20 + * @var int
  21 + */
  22 + protected $headers =
  23 + Request::HEADER_X_FORWARDED_FOR |
  24 + Request::HEADER_X_FORWARDED_HOST |
  25 + Request::HEADER_X_FORWARDED_PORT |
  26 + Request::HEADER_X_FORWARDED_PROTO |
  27 + Request::HEADER_X_FORWARDED_AWS_ELB;
  28 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Middleware;
  4 +
  5 +use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
  6 +
  7 +class VerifyCsrfToken extends Middleware
  8 +{
  9 + /**
  10 + * The URIs that should be excluded from CSRF verification.
  11 + *
  12 + * @var array<int, string>
  13 + */
  14 + protected $except = [
  15 + //
  16 + ];
  17 +}
  1 +<?php
  2 +
  3 +namespace App\Http\Requests\Aside;
  4 +
  5 +use App\Enums\Common\Demo;
  6 +use BenSampo\Enum\Rules\EnumValue;
  7 +use Illuminate\Foundation\Http\FormRequest;
  8 +
  9 +class DemoRequest extends FormRequest
  10 +{
  11 + /**
  12 + * Determine if the user is authorized to make this request.
  13 + *
  14 + * @return bool
  15 + */
  16 + public function authorize()
  17 + {
  18 + return true;
  19 + }
  20 +
  21 + /**
  22 + * Get the validation rules that apply to the request.
  23 + *
  24 + * @return array
  25 + */
  26 + public function rules()
  27 + {
  28 + return [
  29 + 'name'=>['required'],
  30 + 'status'=>['required','integer',new EnumValue(Demo::class)]
  31 + ];
  32 + }
  33 +}
  1 +<?php
  2 +
  3 +namespace App\Models;
  4 +
  5 +use Illuminate\Contracts\Auth\MustVerifyEmail;
  6 +use Illuminate\Database\Eloquent\Factories\HasFactory;
  7 +use Illuminate\Foundation\Auth\User as Authenticatable;
  8 +use Illuminate\Notifications\Notifiable;
  9 +use Laravel\Sanctum\HasApiTokens;
  10 +
  11 +class User extends Authenticatable
  12 +{
  13 + use HasApiTokens, HasFactory, Notifiable;
  14 +
  15 + /**
  16 + * The attributes that are mass assignable.
  17 + *
  18 + * @var array<int, string>
  19 + */
  20 + protected $fillable = [
  21 + 'name',
  22 + 'email',
  23 + 'password',
  24 + ];
  25 +
  26 + /**
  27 + * The attributes that should be hidden for serialization.
  28 + *
  29 + * @var array<int, string>
  30 + */
  31 + protected $hidden = [
  32 + 'password',
  33 + 'remember_token',
  34 + ];
  35 +
  36 + /**
  37 + * The attributes that should be cast.
  38 + *
  39 + * @var array<string, string>
  40 + */
  41 + protected $casts = [
  42 + 'email_verified_at' => 'datetime',
  43 + ];
  44 +}
  1 +<?php
  2 +
  3 +namespace App\Providers;
  4 +
  5 +use Illuminate\Support\ServiceProvider;
  6 +
  7 +class AppServiceProvider extends ServiceProvider
  8 +{
  9 + /**
  10 + * Register any application services.
  11 + *
  12 + * @return void
  13 + */
  14 + public function register()
  15 + {
  16 + //
  17 + }
  18 +
  19 + /**
  20 + * Bootstrap any application services.
  21 + *
  22 + * @return void
  23 + */
  24 + public function boot()
  25 + {
  26 + //
  27 + }
  28 +}
  1 +<?php
  2 +
  3 +namespace App\Providers;
  4 +
  5 +use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
  6 +use Illuminate\Support\Facades\Gate;
  7 +
  8 +class AuthServiceProvider extends ServiceProvider
  9 +{
  10 + /**
  11 + * The policy mappings for the application.
  12 + *
  13 + * @var array<class-string, class-string>
  14 + */
  15 + protected $policies = [
  16 + // 'App\Models\Model' => 'App\Policies\ModelPolicy',
  17 + ];
  18 +
  19 + /**
  20 + * Register any authentication / authorization services.
  21 + *
  22 + * @return void
  23 + */
  24 + public function boot()
  25 + {
  26 + $this->registerPolicies();
  27 +
  28 + //
  29 + }
  30 +}
  1 +<?php
  2 +
  3 +namespace App\Providers;
  4 +
  5 +use Illuminate\Support\Facades\Broadcast;
  6 +use Illuminate\Support\ServiceProvider;
  7 +
  8 +class BroadcastServiceProvider extends ServiceProvider
  9 +{
  10 + /**
  11 + * Bootstrap any application services.
  12 + *
  13 + * @return void
  14 + */
  15 + public function boot()
  16 + {
  17 + Broadcast::routes();
  18 +
  19 + require base_path('routes/channels.php');
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace App\Providers;
  4 +
  5 +use Illuminate\Auth\Events\Registered;
  6 +use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
  7 +use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
  8 +use Illuminate\Support\Facades\Event;
  9 +
  10 +class EventServiceProvider extends ServiceProvider
  11 +{
  12 + /**
  13 + * The event listener mappings for the application.
  14 + *
  15 + * @var array<class-string, array<int, class-string>>
  16 + */
  17 + protected $listen = [
  18 + Registered::class => [
  19 + SendEmailVerificationNotification::class,
  20 + ],
  21 + ];
  22 +
  23 + /**
  24 + * Register any events for your application.
  25 + *
  26 + * @return void
  27 + */
  28 + public function boot()
  29 + {
  30 + //
  31 + }
  32 +}
  1 +<?php
  2 +
  3 +namespace App\Providers;
  4 +
  5 +use Illuminate\Cache\RateLimiting\Limit;
  6 +use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
  7 +use Illuminate\Http\Request;
  8 +use Illuminate\Support\Facades\RateLimiter;
  9 +use Illuminate\Support\Facades\Route;
  10 +
  11 +class RouteServiceProvider extends ServiceProvider
  12 +{
  13 + /**
  14 + * The path to the "home" route for your application.
  15 + *
  16 + * This is used by Laravel authentication to redirect users after login.
  17 + *
  18 + * @var string
  19 + */
  20 + public const HOME = '/home';
  21 +
  22 + /**
  23 + * The controller namespace for the application.
  24 + *
  25 + * When present, controller route declarations will automatically be prefixed with this namespace.
  26 + *
  27 + * @var string|null
  28 + */
  29 + // protected $namespace = 'App\\Http\\Controllers';
  30 +
  31 + /**
  32 + * Define your route model bindings, pattern filters, etc.
  33 + *
  34 + * @return void
  35 + */
  36 + public function boot()
  37 + {
  38 + $this->configureRateLimiting();
  39 +
  40 + //预定义两个端的API路由
  41 + $this->mapAsideRoute();
  42 + $this->mapBsideRoute();
  43 +
  44 +// 暂时无用
  45 +// $this->routes(function () {
  46 +// Route::prefix('api')
  47 +// ->middleware('api')
  48 +// ->namespace($this->namespace)
  49 +// ->group(base_path('routes/api.php'));
  50 +//
  51 +// Route::middleware('web')
  52 +// ->namespace($this->namespace)
  53 +// ->group(base_path('routes/web.php'));
  54 +// });
  55 + }
  56 +
  57 + /**
  58 + *A端API路由
  59 + * @return void
  60 + */
  61 + protected function mapAsideRoute(){
  62 + Route::middleware('aside')
  63 + ->prefix('a')
  64 + ->namespace($this->namespace . '\Aside')
  65 + ->group(base_path('routes/aside.php'));
  66 + }
  67 + /**
  68 + *B端API路由
  69 + * @return void
  70 + */
  71 + protected function mapBsideRoute(){
  72 + Route::middleware('bside')
  73 + ->prefix('b')
  74 + ->namespace($this->namespace . '\Bside')
  75 + ->group(base_path('routes/bside.php'));
  76 + }
  77 +
  78 + /**
  79 + * Configure the rate limiters for the application.
  80 + *
  81 + * @return void
  82 + */
  83 + protected function configureRateLimiting()
  84 + {
  85 + RateLimiter::for('api', function (Request $request) {
  86 + return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
  87 + });
  88 + }
  89 +}
  1 +<?php
  2 +/**
  3 + * @author:wlj
  4 + * @date: 2022/6/30 15:44
  5 + */
  6 +
  7 +namespace App\Services;
  8 +
  9 +use App\Enums\Common\Code;
  10 +use App\Exceptions\BsideGlobalException;
  11 +use App\Traits\RedisTrait;
  12 +
  13 +class BaseService
  14 +{
  15 + /**
  16 + * @notes: 手动抛出异常
  17 + * @param string $code
  18 + * @throws BsideGlobalException
  19 + * @author:wlj
  20 + * @date: 2022/7/19 14:25
  21 + */
  22 + public function fail(string $code = Code::SYSTEM_ERROR)
  23 + {
  24 + throw new BsideGlobalException($code);
  25 + }
  26 +}
  1 +<?php
  2 +/**
  3 + * @author:wlj
  4 + * @date: 2022/8/10 15:02
  5 + */
  6 +
  7 +namespace App\Services;
  8 +
  9 +use App\Enums\Common\RedisKey;
  10 +use App\Services\BaseService;
  11 +use App\Traits\RedisTrait;
  12 +use App\Utils\HttpUtils;
  13 +
  14 +class DingService extends BaseService
  15 +{
  16 + use RedisTrait;
  17 +
  18 + const LINK = 'https://oapi.dingtalk.com/robot/send?access_token=723c99369cc16806a26fee8b8ab2c5ae37a78ef842e6a3af89fed0b2a6211836';
  19 + const INFO = 'INFO';
  20 + const ERROR = 'ERROR';
  21 + const WARNNING = 'WARNNING';
  22 + const OTHER = 'OTHER';
  23 +
  24 +
  25 + /**
  26 + * @notes: 发送钉钉消息 同样的消息 1分钟内不重复
  27 + * @param array $body
  28 + * @return int|mixed
  29 + * @author:wlj
  30 + * @date: 2022/8/10 15:31
  31 + */
  32 + public function handle(array $body)
  33 + {
  34 + $msgKey = mb_substr($body['msg'], 50);
  35 + if (!$this->getData(RedisKey::DING_MSG . $msgKey)) {
  36 + $arr = [
  37 + 'msgtype' => 'text',
  38 + 'text' => [
  39 + 'content' => $body['keyword'] . PHP_EOL . $body['msg']
  40 + ],
  41 + 'at' => [
  42 + 'atMobiles' => [],
  43 + 'atUserIds' => [],
  44 + 'isAtAll' => $body['isAtAll'],
  45 + ]
  46 + ];
  47 + $re = json_decode(HttpUtils::post(self::LINK, $arr), true);
  48 + $this->setData(RedisKey::DING_MSG . $msgKey, true, 60);
  49 + return $re['errcode'] ?? 0;
  50 + }
  51 + return 0;
  52 +
  53 + }
  54 +
  55 +}
  1 +<?php
  2 +
  3 +namespace App\Traits;
  4 +
  5 +use App\Enums\Common\Common;
  6 +use App\Enums\Common\RedisKey;
  7 +use App\Utils\RedisUtils;
  8 +use Illuminate\Support\Facades\Redis;
  9 +
  10 +/**
  11 + * @author:wlj
  12 + * @date: 2022/5/30 17:08
  13 + */
  14 +trait RedisTrait
  15 +{
  16 + public $login_expire_time;
  17 + public $redis;
  18 +
  19 + public function __construct()
  20 + {
  21 + $this->login_expire_time = config('app.login_expire_time');
  22 + $this->redis = RedisUtils::getClient();
  23 + }
  24 +
  25 + /**
  26 + * @notes: 获取redis
  27 + * @return Redis
  28 + * @author:wlj
  29 + * @date: 2022/5/30 17:16
  30 + */
  31 + public function isLock($key): bool
  32 + {
  33 + return (bool)$this->redis->get($key);
  34 + }
  35 +
  36 + /**
  37 + * @notes: 加锁
  38 + * @param $key
  39 + * @param int $time 秒
  40 + * @return bool
  41 + * @author:wlj
  42 + * @date: 2022/5/30 17:22
  43 + */
  44 + public function lock($key, $time = 600): bool
  45 + {
  46 + return $this->redis->setnx($key, 1) && $this->redis->expire($key, $time);
  47 + }
  48 +
  49 + /**
  50 + * @notes: 解锁
  51 + * @return bool
  52 + * @author:wlj
  53 + * @date: 2022/5/30 17:22
  54 + */
  55 + public function unLock($key): bool
  56 + {
  57 + return $this->redis->del($key);
  58 + }
  59 +
  60 + public function blpop($key, $bltime = 10)
  61 + {
  62 + return $this->redis->blPop($key, $bltime);
  63 + }
  64 +
  65 + /**
  66 + * @notes: 获取位图数据
  67 + * @return Redis
  68 + * @author:wlj
  69 + * @date: 2022/5/30 17:16
  70 + */
  71 + public function getBit($key, $offset): bool
  72 + {
  73 + return (bool)$this->redis->getBit($key, $offset);
  74 + }
  75 +
  76 + public function setBit($key, $offset, $value): bool
  77 + {
  78 + return (bool)$this->redis->setBit($key, $offset, $value);
  79 + }
  80 +
  81 + /**
  82 + * @notes: 获取为1的数量
  83 + * @param $key
  84 + * @param null $start
  85 + * @param null $end
  86 + * @return int
  87 + * @author:wlj
  88 + * @date: 2022/6/9 18:29
  89 + */
  90 +
  91 + public function bitCount($key, $start = null, $end = null)
  92 + {
  93 + if ($start == null || $end == null) {
  94 + return $this->redis->bitCount($key);
  95 + }
  96 + return $this->redis->bitCount($key, $start, $end);
  97 + }
  98 +
  99 + public function setData($key, $value, $timeout = null)
  100 + {
  101 + return $this->redis->set($key, $value, $timeout);
  102 + }
  103 +
  104 + public function getData($key)
  105 + {
  106 + return $this->redis->get($key);
  107 + }
  108 +
  109 + public function delData($key)
  110 + {
  111 + return $this->redis->del($key);
  112 + }
  113 +
  114 + public function hGet($key, $hashKey)
  115 + {
  116 + return $this->redis->hGet($key, $hashKey);
  117 + }
  118 +
  119 + public function hGetAll($key)
  120 + {
  121 + return $this->redis->hGetAll($key);
  122 + }
  123 +
  124 + public function sadd($key, ...$value1)
  125 + {
  126 + return $this->redis->sadd($key, ...$value1);
  127 + }
  128 +
  129 + public function smembers($key)
  130 + {
  131 + return $this->redis->sMembers($key);
  132 + }
  133 +
  134 +
  135 + public function sRem($key, ...$member1)
  136 + {
  137 + return $this->redis->sRem($key, ...$member1);
  138 + }
  139 +
  140 +
  141 + public function hSet($key, $hashKey, $value)
  142 + {
  143 + return $this->redis->hSet($key, $hashKey, $value);
  144 + }
  145 +
  146 + public function hDel($key, $hashKey)
  147 + {
  148 + return $this->redis->hDel($key, $hashKey);
  149 + }
  150 +
  151 + #region 登录相关
  152 +
  153 + /**
  154 + * @notes: 用户登录设置
  155 + * @param array $userInfo
  156 + * @param $token
  157 + * @author:wlj
  158 + * @date: 2022/6/14 16:34
  159 + */
  160 + public function loginset(array $userInfo, $token)
  161 + {
  162 + $this->setData(RedisKey::USER_LOGIN . $token, json_encode($userInfo, true), $this->login_expire_time);
  163 + $this->redis->sAdd(RedisKey::USER_TOKEN . $userInfo['account_id'], $token);
  164 +// $this->setData(RedisKey::USER_TOKEN . $userInfo['account_id'], $token, $this->login_expire_time);
  165 + $this->hSet(RedisKey::USER_LAST_LOGIN_COMPANY, $userInfo['account_id'], $userInfo['company_id']);
  166 + return true;
  167 + }
  168 +
  169 + /**
  170 + * @notes: 获取登录信息
  171 + * @param $token
  172 + * @return mixed
  173 + * @author:wlj
  174 + * @date: 2022/7/8 17:15
  175 + */
  176 + public function getloginset($token)
  177 + {
  178 + $singleSign = config('app.single_sign');
  179 + $userInfo = json_decode($this->getData(RedisKey::USER_LOGIN . $token), true);
  180 + $hasToken = false;
  181 + if ($userInfo) {
  182 + $hasToken = $this->redis->sIsMember(RedisKey::USER_TOKEN . $userInfo['account_id'], $token);
  183 + }
  184 + //单点登录
  185 +// if ($singleSign) {
  186 +// $accountId = $userInfo['account_id'] ?? 0;
  187 +// $tokenOri = $this->getData(RedisKey::USER_TOKEN . $accountId);
  188 +// if ($userInfo && ($token == $tokenOri)) {
  189 +// return $userInfo;
  190 +// } else {
  191 +// return [];
  192 +// }
  193 +// }
  194 +// else {
  195 +// return empty($userInfo) ? [] : $userInfo;
  196 +// }
  197 + return (!empty($userInfo) && $hasToken) ? $userInfo : [];
  198 + }
  199 +
  200 + /**
  201 + * @notes: 用户退出登录设置
  202 + * @param $token
  203 + * @author:wlj
  204 + * @date: 2022/6/14 16:34
  205 + */
  206 + public function logoutset($token)
  207 + {
  208 + $singleSign = config('app.single_sign');
  209 +
  210 + $userInfo = json_decode($this->getData(RedisKey::USER_LOGIN . $token), true);
  211 + //清除redis tokren对应 user_info数据
  212 + $this->redis->del(RedisKey::USER_LOGIN . $token);
  213 + if ($userInfo) {
  214 + //清除redis token集合中的数据
  215 + $this->redis->sRem(RedisKey::USER_TOKEN . $userInfo['account_id'], $token);
  216 + //退出登录时 删除公司权限
  217 + $this->redis->hDel(RedisKey::USER_PERMISSION, $userInfo['id']);
  218 + }
  219 +
  220 +// if ($singleSign && $userInfo) {
  221 +// $userInfo = json_decode($userInfo, true);
  222 +// $this->redis->del(RedisKey::USER_TOKEN . $userInfo['account_id']);
  223 +// }
  224 +
  225 + return true;
  226 + }
  227 +
  228 + /**
  229 + * @notes: 用户退出登录设置--通过accountId
  230 + * @param $accountId
  231 + * @return bool
  232 + * @author:wlj
  233 + * @date: 2023/3/2 17:08
  234 + */
  235 + public function logoutsetByaccountId($accountId)
  236 + {
  237 + $tokens = $this->redis->sMembers(RedisKey::USER_TOKEN . $accountId);
  238 + $this->delData(RedisKey::USER_TOKEN . $accountId);
  239 + foreach ($tokens as $token) {
  240 + $this->redis->del(RedisKey::USER_LOGIN . $token);
  241 + }
  242 +
  243 + return true;
  244 + }
  245 +
  246 + #endregion 登录相关
  247 +
  248 + /**
  249 + * 设置用户权限
  250 + * @param $userId
  251 + * @param array $permissions
  252 + * @return bool|int
  253 + */
  254 + public function setUserPermission($userId, $permissions = [])
  255 + {
  256 + return $this->hSet(RedisKey::USER_PERMISSION, $userId, json_encode($permissions));
  257 + }
  258 +
  259 + /**
  260 + * 获取用户权限
  261 + * @param $userId
  262 + * @return array
  263 + */
  264 + public function getUserPermission($userId): array
  265 + {
  266 + $permissions = $this->hGet(RedisKey::USER_PERMISSION, $userId);
  267 + return empty($permissions) ? [] : json_decode($permissions, true);
  268 + }
  269 +
  270 + /**
  271 + * 删除用户公司权限
  272 + * @param $userId
  273 + */
  274 + public function deleteUserPermission($userId)
  275 + {
  276 + return $this->hDel(RedisKey::USER_PERMISSION, $userId);
  277 + }
  278 +
  279 + /**
  280 + * 设置项目成员权限
  281 + * @param $userId
  282 + * @param array $permissions
  283 + * @return bool|int
  284 + */
  285 + public function setProjectMemberPermission($memberId, $permissions = [])
  286 + {
  287 + return $this->hSet(RedisKey::MEMBER_PROJECT_PERMISSION, $memberId, json_encode($permissions));
  288 + }
  289 +
  290 + /**
  291 + * 获取项目成员权限
  292 + * @param $userId
  293 + * @return array
  294 + */
  295 + public function getProjectMemberPermission($memberId): array
  296 + {
  297 + $permissions = $this->hGet(RedisKey::MEMBER_PROJECT_PERMISSION, $memberId);
  298 + return empty($permissions) ? [] : json_decode($permissions, true);
  299 + }
  300 +
  301 + /**
  302 + * 删除项目员工权限
  303 + * @param $memberId
  304 + */
  305 + public function deleteProjectMemberPermission($memberId)
  306 + {
  307 + return $this->hDel(RedisKey::MEMBER_PROJECT_PERMISSION, $memberId);
  308 + }
  309 +
  310 + /**
  311 + * @notes: 删除数据
  312 + * @param $key
  313 + * @return int
  314 + * @author:wlj
  315 + * @date: 2022/10/31 15:58
  316 + */
  317 + public function deleteKey($key)
  318 + {
  319 + return $this->redis->del($key);
  320 + }
  321 +
  322 + /**
  323 + * @notes: 获取用户的fd 空为未上线 无需推送
  324 + * @param $token
  325 + * @return bool|mixed|string
  326 + * @author:wlj
  327 + * @date: 2022/10/31 15:59
  328 + */
  329 + public function getUserFd($token)
  330 + {
  331 + return $this->getData(RedisKey::USER_FD_DATA . $token);
  332 + }
  333 +
  334 + /**
  335 + * @notes: 给用户们添加新的未读的需求
  336 + * @param array $userIds
  337 + * @param int $storyId
  338 + * @author:wlj
  339 + * @date: 2022/11/2 16:00
  340 + */
  341 + public function addUserAbeyanceStory($userIds = [], $storyId = 0)
  342 + {
  343 + foreach ($userIds as $userId) {
  344 + $this->hSet(RedisKey::USER_ABEYANCE_STORY . $userId, $storyId, Common::YES);
  345 + }
  346 + return true;
  347 + }
  348 +
  349 + public function readUserAbeyanceStory($userIds = [], $storyId = 0)
  350 + {
  351 + foreach ($userIds as $userId) {
  352 + $this->hDel(RedisKey::USER_ABEYANCE_STORY . $userId, $storyId);
  353 + }
  354 + return true;
  355 + }
  356 +
  357 + public function getKeys($patten)
  358 + {
  359 + return $this->redis->keys($patten);
  360 + }
  361 +
  362 + /**
  363 + * @notes: 插入用户最近查看数据 默认10条 多的会trim掉
  364 + * @author:wlj
  365 + * @date: 2023/2/20 16:57
  366 + */
  367 + public function setUserRecentActions($companId, $userId, $actionableType, $actionableId)
  368 + {
  369 + $user_recent_limit = config('app.user_recent_limit');
  370 + $start = 0;
  371 + $stop = -$user_recent_limit - 1;
  372 + $this->redis->zAdd(RedisKey::USER_RECENT_ACTIONS . $companId . '_' . $userId . '_' . $actionableType, [], time(), $actionableId);
  373 + $this->redis->zRemRangeByRank(RedisKey::USER_RECENT_ACTIONS . $companId . '_' . $userId . '_' . $actionableType, $start, $stop);
  374 + return true;
  375 + }
  376 +
  377 + /**
  378 + * @notes: 获取用户最近查看数据 默认10条
  379 + * @param $companId
  380 + * @param $userId
  381 + * @param $actionableType
  382 + * @return array
  383 + * @author:wlj
  384 + * @date: 2023/2/21 10:05
  385 + */
  386 + public function getUserRecentActions($companId, $userId, $actionableType)
  387 + {
  388 + return $this->redis->zRevRangeByScore(RedisKey::USER_RECENT_ACTIONS . $companId . '_' . $userId . '_' . $actionableType, +INF, -INF, ['withscores' => true]);
  389 + }
  390 +
  391 +}
  1 +<?php
  2 +/**
  3 + * @note 常用的加密解密
  4 + * @author:wlj
  5 + * @date: 2022/6/10 14:37
  6 + */
  7 +
  8 +namespace App\Utils;
  9 +
  10 +
  11 +class EncryptUtils
  12 +{
  13 +
  14 + /**
  15 + * @notes: 使用openssl密码库 传入加密算法 des对称加密
  16 + * @param $data
  17 + * @param $key
  18 + * @param $iv
  19 + * @param string $algo
  20 + * @return string
  21 + * @author:wlj
  22 + * @date: 2022/6/10 15:03
  23 + */
  24 + function openssl_en($data, $key, $iv, $algo = 'DES-EDE3-CBC')
  25 + {
  26 + if (is_array($data) || is_object($data)) {
  27 + $data = json_encode($data, true);
  28 + }
  29 +
  30 +// $len = strlen($data);
  31 +// if ($len % 8) {
  32 +// $data = str_pad($data, $len + 8 - $len % 8, "\0");
  33 +// }//使用空字符填充字符串的右侧,使字符串位数变为8的倍数
  34 +
  35 +
  36 + return base64_encode(openssl_encrypt($data, $algo, $key, /*OPENSSL_RAW_DATA | OPENSSL_NO_PADDING*/ 0, $iv));
  37 + }
  38 +
  39 + function openssl_de(string $data, $key, $iv, $algo = 'DES-EDE3-CBC')
  40 + {
  41 + $decrypt = rtrim(openssl_decrypt(base64_decode($data), $algo, $key, /*OPENSSL_RAW_DATA | OPENSSL_NO_PADDING*/ 0, $iv), "\0");
  42 + return json_decode($decrypt, true);
  43 + }
  44 +
  45 + // 加密
  46 + function lock_url($txt, $key = 'blog.qsjob.top')
  47 + {
  48 + $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  49 + $nh = rand(0, 64);
  50 + $ch = $chars[$nh];
  51 + $mdKey = md5($key . $ch);
  52 + $mdKey = substr($mdKey, $nh % 8, $nh % 8 + 7);
  53 + $txt = base64_encode($txt);
  54 + $tmp = '';
  55 + $i = 0;
  56 + $j = 0;
  57 + $k = 0;
  58 + for ($i = 0; $i < strlen($txt); $i++) {
  59 + $k = $k == strlen($mdKey) ? 0 : $k;
  60 + $j = ($nh + strpos($chars, $txt[$i]) + ord($mdKey[$k++])) % 64;
  61 + $tmp .= $chars[$j];
  62 + }
  63 + return urlencode($ch . $tmp);
  64 + }
  65 +
  66 + // 解密
  67 + function unlock_url($txt, $key = 'blog.qsjob.top')
  68 + {
  69 + $txt = urldecode($txt);
  70 + $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  71 + $ch = $txt[0];
  72 + $nh = strpos($chars, $ch);
  73 + $mdKey = md5($key . $ch);
  74 + $mdKey = substr($mdKey, $nh % 8, $nh % 8 + 7);
  75 + $txt = substr($txt, 1);
  76 + $tmp = '';
  77 + $i = 0;
  78 + $j = 0;
  79 + $k = 0;
  80 + for ($i = 0; $i < strlen($txt); $i++) {
  81 + $k = $k == strlen($mdKey) ? 0 : $k;
  82 + $j = strpos($chars, $txt[$i]) - $nh - ord($mdKey[$k++]);
  83 + while ($j < 0) {
  84 + $j += 64;
  85 + }
  86 + $tmp .= $chars[$j];
  87 + }
  88 + return base64_decode($tmp);
  89 + }
  90 +
  91 + // 加密
  92 + //echo lock_url('这是第二种自定义加密解密函数');
  93 + //解密
  94 + //echo unlock_url(lock_url('这是第二种自定义加密解密函数'));
  95 +
  96 + //加密
  97 + function passport_encrypt($txt, $key = 'blog.qsjob.top')
  98 + {
  99 + srand((double)microtime() * 1000000);
  100 + $encrypt_key = md5(rand(0, 32000));
  101 + $ctr = 0;
  102 + $tmp = '';
  103 + for ($i = 0; $i < strlen($txt); $i++) {
  104 + $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  105 + $tmp .= $encrypt_key[$ctr] . ($txt[$i] ^ $encrypt_key[$ctr++]);
  106 + }
  107 + return urlencode(base64_encode($this->passport_key($tmp, $key)));
  108 + }
  109 +
  110 + // 解密
  111 + function passport_decrypt($txt, $key = 'blog.qsjob.top')
  112 + {
  113 + $txt = $this->passport_key(base64_decode(urldecode($txt)), $key);
  114 + $tmp = '';
  115 + for ($i = 0; $i < strlen($txt); $i++) {
  116 + $md5 = $txt[$i];
  117 + $tmp .= $txt[++$i] ^ $md5;
  118 + }
  119 + return $tmp;
  120 + }
  121 +
  122 + // 解析算法
  123 + function passport_key($txt, $encrypt_key)
  124 + {
  125 + $encrypt_key = md5($encrypt_key);
  126 + $ctr = 0;
  127 + $tmp = '';
  128 + for ($i = 0; $i < strlen($txt); $i++) {
  129 + $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  130 + $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
  131 + }
  132 + return $tmp;
  133 + }
  134 + //$txt = "1"; // 加密数据
  135 + //$key = "testkey"; //加密密钥
  136 + ////加密
  137 + //$encrypt = passport_encrypt($txt,$key);
  138 + //echo $encrypt;
  139 + //// 解密
  140 + //echo passport_decrypt($encrypt,$key);
  141 + //
  142 +
  143 +
  144 + //非常给力的authcode加密函数,Discuz!经典代码(带详解)
  145 + //函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。
  146 + function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
  147 + {
  148 + // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  149 + $ckey_length = 4;
  150 + // 密匙
  151 + $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  152 + // 密匙a会参与加解密
  153 + $keya = md5(substr($key, 0, 16));
  154 + // 密匙b会用来做数据完整性验证
  155 + $keyb = md5(substr($key, 16, 16));
  156 + // 密匙c用于变化生成的密文
  157 + $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
  158 + // 参与运算的密匙
  159 + $cryptkey = $keya . md5($keya . $keyc);
  160 + $key_length = strlen($cryptkey);
  161 + // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
  162 + //解密时会通过这个密匙验证数据完整性
  163 + // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  164 + $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
  165 + $string_length = strlen($string);
  166 + $result = '';
  167 + $box = range(0, 255);
  168 + $rndkey = array();
  169 + // 产生密匙簿
  170 + for ($i = 0; $i <= 255; $i++) {
  171 + $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  172 + }
  173 + // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  174 + for ($j = $i = 0; $i < 256; $i++) {
  175 + $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  176 + $tmp = $box[$i];
  177 + $box[$i] = $box[$j];
  178 + $box[$j] = $tmp;
  179 + }
  180 + // 核心加解密部分
  181 + for ($a = $j = $i = 0; $i < $string_length; $i++) {
  182 + $a = ($a + 1) % 256;
  183 + $j = ($j + $box[$a]) % 256;
  184 + $tmp = $box[$a];
  185 + $box[$a] = $box[$j];
  186 + $box[$j] = $tmp;
  187 + // 从密匙簿得出密匙进行异或,再转成字符
  188 + $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  189 + }
  190 + if ($operation == 'DECODE') {
  191 + // 验证数据有效性,请看未加密明文的格式
  192 + if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
  193 + return substr($result, 26);
  194 + } else {
  195 + return '';
  196 + }
  197 + } else {
  198 + // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  199 + // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  200 + return $keyc . str_replace('=', '', base64_encode($result));
  201 + }
  202 + }
  203 + //$str = 'jobhansome';
  204 + //$key = 'blog.qsjob.top';
  205 + //echo authcode($str,'ENCODE',$key,0); //加密
  206 + //$str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';
  207 + //echo authcode($str,'DECODE',$key,0); //解密
  208 +
  209 +}
  1 +<?php
  2 +
  3 +
  4 +namespace App\Utils;
  5 +
  6 +
  7 +use App\Enums\Common\Code;
  8 +use App\Exceptions\BsideGlobalException;
  9 +use Illuminate\Http\Client\Response;
  10 +use Illuminate\Support\Facades\Http;
  11 +
  12 +
  13 +class HttpUtils
  14 +{
  15 + /**
  16 + * @notes: 异常处理
  17 + * @param \Illuminate\Http\Client\Response $response
  18 + * @return bool|void
  19 + * @throws BsideGlobalException
  20 + * @author:wlj
  21 + * @date: 2022/6/7 16:34
  22 + */
  23 + public static function checkSuccess(Response $response)
  24 + {
  25 + // 确认状态码是否在 200 到 300 之间(包含 200)
  26 + if ($response->successful()) {
  27 + return true;
  28 + }
  29 + // 确认是否发生了 400 级别的错误(以 4 开头的状态码) // 确认是否发生了 500 级别的错误(以 5 开头的状态码)
  30 + if ($response->clientError() || $response->serverError()) {
  31 + throw new BsideGlobalException(Code::SERVER_ERROR);
  32 + }
  33 + }
  34 +
  35 +
  36 + /**
  37 + * get请求
  38 + * @param $url
  39 + * @param $data
  40 + * @param $token
  41 + * @return int
  42 + * @throws \GuzzleHttp\Exception\GuzzleException
  43 + */
  44 + public static function get($url, $data, $headers = [])
  45 + {
  46 + LogUtils::info("HttpUtils-GET请求URL:" . $url);
  47 + $response = Http::withHeaders($headers)->get($url, $data);
  48 + self::checkSuccess($response);
  49 + return $response->getBody()->getContents();
  50 + }
  51 +
  52 + public static function post($url, $data, $headers = [])
  53 + {
  54 + LogUtils::info("HttpUtils-POST请求URL:" . $url);
  55 + $response = Http::withHeaders($headers)->post($url, $data);
  56 + self::checkSuccess($response);
  57 + return $response->getBody()->getContents();
  58 + }
  59 +
  60 + /**
  61 + * post raw
  62 + * @param $url
  63 + * @param $data
  64 + * @return string
  65 + * @throws \GuzzleHttp\Exception\GuzzleException
  66 + */
  67 + public static function putRow($url, $data, $headers = [])
  68 + {
  69 + LogUtils::info("切换公司加密putRow入参:url:" . $url . '----data:', $data, $headers);
  70 + if (is_array($data)) {
  71 + $response = Http::withHeaders($headers)->put($url, $data);
  72 + } else {
  73 + $response = Http::withHeaders($headers)->send('PUT', $url, [
  74 + 'body' => $data
  75 + ]);
  76 + }
  77 +
  78 + self::checkSuccess($response);
  79 + $body = $response->getBody()->getContents();
  80 +
  81 + LogUtils::info("切换公司加密putRow返回:", $body);
  82 + return $body;
  83 +
  84 +
  85 + }
  86 +
  87 +
  88 +}
  1 +<?php
  2 +/**
  3 + * @author:wlj
  4 + * @date: 2022/6/7 16:39
  5 + */
  6 +
  7 +namespace App\Utils;
  8 +
  9 +use App\Enums\Common\Common;
  10 +use Illuminate\Support\Facades\Log;
  11 +use Illuminate\Support\Facades\Route;
  12 +
  13 +class LogUtils
  14 +{
  15 + /**
  16 + * ERROR层级日志
  17 + * @param $title
  18 + * @param $params
  19 + * @param $response
  20 + * @return void
  21 + */
  22 + public static function error($title, $params = [], $response = [])
  23 + {
  24 + $route=Route::current();
  25 + $side=$route->action['prefix']??Common::A;
  26 + $params = is_array($params) ? json_encode($params, JSON_UNESCAPED_UNICODE) : $params;
  27 + $response = is_array($response) || is_object($response) ? json_encode($response, JSON_UNESCAPED_UNICODE) : $response;
  28 + Log::channel($side.'side')->error("$title::请求参数:$params--------响应:$response");
  29 + }
  30 +
  31 + /**
  32 + * INFO层级日志
  33 + * @param $title
  34 + * @param $params
  35 + * @param $response
  36 + * @return void
  37 + */
  38 + public static function info($title, $params = [], $response = [])
  39 + {
  40 + $route=Route::current();
  41 + $side=$route->action['prefix']??Common::A;
  42 + $params = is_array($params) ? json_encode($params, JSON_UNESCAPED_UNICODE) : $params;
  43 + $response = is_array($response) || is_object($response) ? json_encode($response, JSON_UNESCAPED_UNICODE) : $response;
  44 + Log::channel($side.'side')->info("$title::请求参数:$params--------响应:$response");
  45 + }
  46 +}
  1 +<?php
  2 +
  3 +
  4 +namespace App\Utils;
  5 +
  6 +/**
  7 + * 单例的redis实例
  8 + */
  9 +class RedisUtils
  10 +{
  11 + private static $redis = null;
  12 +
  13 + private function __construct()
  14 + {
  15 + }
  16 +
  17 + private function __clone()
  18 + {
  19 + }
  20 +
  21 + public static function getClient($redisKey = 'default')
  22 + {
  23 + if (!self::$redis) {
  24 + $config = config("database.redis.{$redisKey}");
  25 + $redis = new \Redis();
  26 + $redis->connect($config['host'], $config['port']);
  27 + $redis->auth($config['password']);
  28 + $redis->select($config['database']);
  29 + self::$redis = $redis;
  30 + }
  31 + return self::$redis;
  32 + }
  33 +
  34 +}
  1 +#!/usr/bin/env php
  2 +<?php
  3 +
  4 +define('LARAVEL_START', microtime(true));
  5 +
  6 +/*
  7 +|--------------------------------------------------------------------------
  8 +| Register The Auto Loader
  9 +|--------------------------------------------------------------------------
  10 +|
  11 +| Composer provides a convenient, automatically generated class loader
  12 +| for our application. We just need to utilize it! We'll require it
  13 +| into the script here so that we do not have to worry about the
  14 +| loading of any of our classes manually. It's great to relax.
  15 +|
  16 +*/
  17 +
  18 +require __DIR__.'/vendor/autoload.php';
  19 +
  20 +$app = require_once __DIR__.'/bootstrap/app.php';
  21 +
  22 +/*
  23 +|--------------------------------------------------------------------------
  24 +| Run The Artisan Application
  25 +|--------------------------------------------------------------------------
  26 +|
  27 +| When we run the console application, the current CLI command will be
  28 +| executed in this console and the response sent back to a terminal
  29 +| or another output device for the developers. Here goes nothing!
  30 +|
  31 +*/
  32 +
  33 +$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
  34 +
  35 +$status = $kernel->handle(
  36 + $input = new Symfony\Component\Console\Input\ArgvInput,
  37 + new Symfony\Component\Console\Output\ConsoleOutput
  38 +);
  39 +
  40 +/*
  41 +|--------------------------------------------------------------------------
  42 +| Shutdown The Application
  43 +|--------------------------------------------------------------------------
  44 +|
  45 +| Once Artisan has finished running, we will fire off the shutdown events
  46 +| so that any final work may be done by the application before we shut
  47 +| down the process. This is the last thing to happen to the request.
  48 +|
  49 +*/
  50 +
  51 +$kernel->terminate($input, $status);
  52 +
  53 +exit($status);
  1 +<?php
  2 +
  3 +/*
  4 +|--------------------------------------------------------------------------
  5 +| Create The Application
  6 +|--------------------------------------------------------------------------
  7 +|
  8 +| The first thing we will do is create a new Laravel application instance
  9 +| which serves as the "glue" for all the components of Laravel, and is
  10 +| the IoC container for the system binding all of the various parts.
  11 +|
  12 +*/
  13 +
  14 +$app = new Illuminate\Foundation\Application(
  15 + $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
  16 +);
  17 +
  18 +/*
  19 +|--------------------------------------------------------------------------
  20 +| Bind Important Interfaces
  21 +|--------------------------------------------------------------------------
  22 +|
  23 +| Next, we need to bind some important interfaces into the container so
  24 +| we will be able to resolve them when needed. The kernels serve the
  25 +| incoming requests to this application from both the web and CLI.
  26 +|
  27 +*/
  28 +
  29 +$app->singleton(
  30 + Illuminate\Contracts\Http\Kernel::class,
  31 + App\Http\Kernel::class
  32 +);
  33 +
  34 +$app->singleton(
  35 + Illuminate\Contracts\Console\Kernel::class,
  36 + App\Console\Kernel::class
  37 +);
  38 +
  39 +$app->singleton(
  40 + Illuminate\Contracts\Debug\ExceptionHandler::class,
  41 + App\Exceptions\Handler::class
  42 +);
  43 +
  44 +/*
  45 +|--------------------------------------------------------------------------
  46 +| Return The Application
  47 +|--------------------------------------------------------------------------
  48 +|
  49 +| This script returns the application instance. The instance is given to
  50 +| the calling script so we can separate the building of the instances
  51 +| from the actual running of the application and sending responses.
  52 +|
  53 +*/
  54 +
  55 +return $app;
  1 +*
  2 +!.gitignore
  1 +{
  2 + "name": "laravel/laravel",
  3 + "type": "project",
  4 + "description": "The Laravel Framework.",
  5 + "keywords": ["framework", "laravel"],
  6 + "license": "MIT",
  7 + "require": {
  8 + "php": "^7.3|^8.0",
  9 + "bensampo/laravel-enum": "^4.2",
  10 + "fruitcake/laravel-cors": "^2.0",
  11 + "guzzlehttp/guzzle": "^7.0.1",
  12 + "laravel/framework": "^8.75",
  13 + "laravel/sanctum": "^2.11",
  14 + "laravel/tinker": "^2.5"
  15 + },
  16 + "require-dev": {
  17 + "facade/ignition": "^2.5",
  18 + "fakerphp/faker": "^1.9.1",
  19 + "laravel/sail": "^1.0.1",
  20 + "mockery/mockery": "^1.4.4",
  21 + "nunomaduro/collision": "^5.10",
  22 + "phpunit/phpunit": "^9.5.10"
  23 + },
  24 + "autoload": {
  25 + "psr-4": {
  26 + "App\\": "app/",
  27 + "Database\\Factories\\": "database/factories/",
  28 + "Database\\Seeders\\": "database/seeders/"
  29 + }
  30 + },
  31 + "autoload-dev": {
  32 + "psr-4": {
  33 + "Tests\\": "tests/"
  34 + }
  35 + },
  36 + "scripts": {
  37 + "post-autoload-dump": [
  38 + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
  39 + "@php artisan package:discover --ansi"
  40 + ],
  41 + "post-update-cmd": [
  42 + "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
  43 + ],
  44 + "post-root-package-install": [
  45 + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
  46 + ],
  47 + "post-create-project-cmd": [
  48 + "@php artisan key:generate --ansi"
  49 + ]
  50 + },
  51 + "extra": {
  52 + "laravel": {
  53 + "dont-discover": []
  54 + }
  55 + },
  56 + "config": {
  57 + "optimize-autoloader": true,
  58 + "preferred-install": "dist",
  59 + "sort-packages": true
  60 + },
  61 + "minimum-stability": "dev",
  62 + "prefer-stable": true
  63 +}
此 diff 太大无法显示。
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Application Name
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This value is the name of your application. This value is used when the
  11 + | framework needs to place the application's name in a notification or
  12 + | any other location as required by the application or its packages.
  13 + |
  14 + */
  15 +
  16 + 'name' => env('APP_NAME', 'Laravel'),
  17 +
  18 + /*
  19 + |--------------------------------------------------------------------------
  20 + | Application Environment
  21 + |--------------------------------------------------------------------------
  22 + |
  23 + | This value determines the "environment" your application is currently
  24 + | running in. This may determine how you prefer to configure various
  25 + | services the application utilizes. Set this in your ".env" file.
  26 + |
  27 + */
  28 +
  29 + 'env' => env('APP_ENV', 'production'),
  30 +
  31 + /*
  32 + |--------------------------------------------------------------------------
  33 + | Application Debug Mode
  34 + |--------------------------------------------------------------------------
  35 + |
  36 + | When your application is in debug mode, detailed error messages with
  37 + | stack traces will be shown on every error that occurs within your
  38 + | application. If disabled, a simple generic error page is shown.
  39 + |
  40 + */
  41 +
  42 + 'debug' => (bool) env('APP_DEBUG', false),
  43 +
  44 + /*
  45 + |--------------------------------------------------------------------------
  46 + | Application URL
  47 + |--------------------------------------------------------------------------
  48 + |
  49 + | This URL is used by the console to properly generate URLs when using
  50 + | the Artisan command line tool. You should set this to the root of
  51 + | your application so that it is used when running Artisan tasks.
  52 + |
  53 + */
  54 +
  55 + 'url' => env('APP_URL', 'http://localhost'),
  56 +
  57 + 'asset_url' => env('ASSET_URL', null),
  58 +
  59 + /*
  60 + |--------------------------------------------------------------------------
  61 + | Application Timezone
  62 + |--------------------------------------------------------------------------
  63 + |
  64 + | Here you may specify the default timezone for your application, which
  65 + | will be used by the PHP date and date-time functions. We have gone
  66 + | ahead and set this to a sensible default for you out of the box.
  67 + |
  68 + */
  69 +
  70 + 'timezone' => 'UTC',
  71 +
  72 + /*
  73 + |--------------------------------------------------------------------------
  74 + | Application Locale Configuration
  75 + |--------------------------------------------------------------------------
  76 + |
  77 + | The application locale determines the default locale that will be used
  78 + | by the translation service provider. You are free to set this value
  79 + | to any of the locales which will be supported by the application.
  80 + |
  81 + */
  82 +
  83 + 'locale' => 'zh-CN',
  84 +
  85 + /*
  86 + |--------------------------------------------------------------------------
  87 + | Application Fallback Locale
  88 + |--------------------------------------------------------------------------
  89 + |
  90 + | The fallback locale determines the locale to use when the current one
  91 + | is not available. You may change the value to correspond to any of
  92 + | the language folders that are provided through your application.
  93 + |
  94 + */
  95 +
  96 + 'fallback_locale' => 'en',
  97 +
  98 + /*
  99 + |--------------------------------------------------------------------------
  100 + | Faker Locale
  101 + |--------------------------------------------------------------------------
  102 + |
  103 + | This locale will be used by the Faker PHP library when generating fake
  104 + | data for your database seeds. For example, this will be used to get
  105 + | localized telephone numbers, street address information and more.
  106 + |
  107 + */
  108 +
  109 + 'faker_locale' => 'en_US',
  110 +
  111 + /*
  112 + |--------------------------------------------------------------------------
  113 + | Encryption Key
  114 + |--------------------------------------------------------------------------
  115 + |
  116 + | This key is used by the Illuminate encrypter service and should be set
  117 + | to a random, 32 character string, otherwise these encrypted strings
  118 + | will not be safe. Please do this before deploying an application!
  119 + |
  120 + */
  121 +
  122 + 'key' => env('APP_KEY'),
  123 +
  124 + 'cipher' => 'AES-256-CBC',
  125 +
  126 + /*
  127 + |--------------------------------------------------------------------------
  128 + | Autoloaded Service Providers
  129 + |--------------------------------------------------------------------------
  130 + |
  131 + | The service providers listed here will be automatically loaded on the
  132 + | request to your application. Feel free to add your own services to
  133 + | this array to grant expanded functionality to your applications.
  134 + |
  135 + */
  136 +
  137 + 'providers' => [
  138 +
  139 + /*
  140 + * Laravel Framework Service Providers...
  141 + */
  142 + Illuminate\Auth\AuthServiceProvider::class,
  143 + Illuminate\Broadcasting\BroadcastServiceProvider::class,
  144 + Illuminate\Bus\BusServiceProvider::class,
  145 + Illuminate\Cache\CacheServiceProvider::class,
  146 + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
  147 + Illuminate\Cookie\CookieServiceProvider::class,
  148 + Illuminate\Database\DatabaseServiceProvider::class,
  149 + Illuminate\Encryption\EncryptionServiceProvider::class,
  150 + Illuminate\Filesystem\FilesystemServiceProvider::class,
  151 + Illuminate\Foundation\Providers\FoundationServiceProvider::class,
  152 + Illuminate\Hashing\HashServiceProvider::class,
  153 + Illuminate\Mail\MailServiceProvider::class,
  154 + Illuminate\Notifications\NotificationServiceProvider::class,
  155 + Illuminate\Pagination\PaginationServiceProvider::class,
  156 + Illuminate\Pipeline\PipelineServiceProvider::class,
  157 + Illuminate\Queue\QueueServiceProvider::class,
  158 + Illuminate\Redis\RedisServiceProvider::class,
  159 + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
  160 + Illuminate\Session\SessionServiceProvider::class,
  161 + Illuminate\Translation\TranslationServiceProvider::class,
  162 + Illuminate\Validation\ValidationServiceProvider::class,
  163 + Illuminate\View\ViewServiceProvider::class,
  164 +
  165 + /*
  166 + * Package Service Providers...
  167 + */
  168 +
  169 + /*
  170 + * Application Service Providers...
  171 + */
  172 + App\Providers\AppServiceProvider::class,
  173 + App\Providers\AuthServiceProvider::class,
  174 + // App\Providers\BroadcastServiceProvider::class,
  175 + App\Providers\EventServiceProvider::class,
  176 + App\Providers\RouteServiceProvider::class,
  177 +
  178 + ],
  179 +
  180 + /*
  181 + |--------------------------------------------------------------------------
  182 + | Class Aliases
  183 + |--------------------------------------------------------------------------
  184 + |
  185 + | This array of class aliases will be registered when this application
  186 + | is started. However, feel free to register as many as you wish as
  187 + | the aliases are "lazy" loaded so they don't hinder performance.
  188 + |
  189 + */
  190 +
  191 + 'aliases' => [
  192 +
  193 + 'App' => Illuminate\Support\Facades\App::class,
  194 + 'Arr' => Illuminate\Support\Arr::class,
  195 + 'Artisan' => Illuminate\Support\Facades\Artisan::class,
  196 + 'Auth' => Illuminate\Support\Facades\Auth::class,
  197 + 'Blade' => Illuminate\Support\Facades\Blade::class,
  198 + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
  199 + 'Bus' => Illuminate\Support\Facades\Bus::class,
  200 + 'Cache' => Illuminate\Support\Facades\Cache::class,
  201 + 'Config' => Illuminate\Support\Facades\Config::class,
  202 + 'Cookie' => Illuminate\Support\Facades\Cookie::class,
  203 + 'Crypt' => Illuminate\Support\Facades\Crypt::class,
  204 + 'Date' => Illuminate\Support\Facades\Date::class,
  205 + 'DB' => Illuminate\Support\Facades\DB::class,
  206 + 'Eloquent' => Illuminate\Database\Eloquent\Model::class,
  207 + 'Event' => Illuminate\Support\Facades\Event::class,
  208 + 'File' => Illuminate\Support\Facades\File::class,
  209 + 'Gate' => Illuminate\Support\Facades\Gate::class,
  210 + 'Hash' => Illuminate\Support\Facades\Hash::class,
  211 + 'Http' => Illuminate\Support\Facades\Http::class,
  212 + 'Js' => Illuminate\Support\Js::class,
  213 + 'Lang' => Illuminate\Support\Facades\Lang::class,
  214 + 'Log' => Illuminate\Support\Facades\Log::class,
  215 + 'Mail' => Illuminate\Support\Facades\Mail::class,
  216 + 'Notification' => Illuminate\Support\Facades\Notification::class,
  217 + 'Password' => Illuminate\Support\Facades\Password::class,
  218 + 'Queue' => Illuminate\Support\Facades\Queue::class,
  219 + 'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
  220 + 'Redirect' => Illuminate\Support\Facades\Redirect::class,
  221 + // 'Redis' => Illuminate\Support\Facades\Redis::class,
  222 + 'Request' => Illuminate\Support\Facades\Request::class,
  223 + 'Response' => Illuminate\Support\Facades\Response::class,
  224 + 'Route' => Illuminate\Support\Facades\Route::class,
  225 + 'Schema' => Illuminate\Support\Facades\Schema::class,
  226 + 'Session' => Illuminate\Support\Facades\Session::class,
  227 + 'Storage' => Illuminate\Support\Facades\Storage::class,
  228 + 'Str' => Illuminate\Support\Str::class,
  229 + 'URL' => Illuminate\Support\Facades\URL::class,
  230 + 'Validator' => Illuminate\Support\Facades\Validator::class,
  231 + 'View' => Illuminate\Support\Facades\View::class,
  232 +
  233 + ],
  234 +
  235 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Authentication Defaults
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This option controls the default authentication "guard" and password
  11 + | reset options for your application. You may change these defaults
  12 + | as required, but they're a perfect start for most applications.
  13 + |
  14 + */
  15 +
  16 + 'defaults' => [
  17 + 'guard' => 'web',
  18 + 'passwords' => 'users',
  19 + ],
  20 +
  21 + /*
  22 + |--------------------------------------------------------------------------
  23 + | Authentication Guards
  24 + |--------------------------------------------------------------------------
  25 + |
  26 + | Next, you may define every authentication guard for your application.
  27 + | Of course, a great default configuration has been defined for you
  28 + | here which uses session storage and the Eloquent user provider.
  29 + |
  30 + | All authentication drivers have a user provider. This defines how the
  31 + | users are actually retrieved out of your database or other storage
  32 + | mechanisms used by this application to persist your user's data.
  33 + |
  34 + | Supported: "session"
  35 + |
  36 + */
  37 +
  38 + 'guards' => [
  39 + 'web' => [
  40 + 'driver' => 'session',
  41 + 'provider' => 'users',
  42 + ],
  43 + ],
  44 +
  45 + /*
  46 + |--------------------------------------------------------------------------
  47 + | User Providers
  48 + |--------------------------------------------------------------------------
  49 + |
  50 + | All authentication drivers have a user provider. This defines how the
  51 + | users are actually retrieved out of your database or other storage
  52 + | mechanisms used by this application to persist your user's data.
  53 + |
  54 + | If you have multiple user tables or models you may configure multiple
  55 + | sources which represent each model / table. These sources may then
  56 + | be assigned to any extra authentication guards you have defined.
  57 + |
  58 + | Supported: "database", "eloquent"
  59 + |
  60 + */
  61 +
  62 + 'providers' => [
  63 + 'users' => [
  64 + 'driver' => 'eloquent',
  65 + 'model' => App\Models\User::class,
  66 + ],
  67 +
  68 + // 'users' => [
  69 + // 'driver' => 'database',
  70 + // 'table' => 'users',
  71 + // ],
  72 + ],
  73 +
  74 + /*
  75 + |--------------------------------------------------------------------------
  76 + | Resetting Passwords
  77 + |--------------------------------------------------------------------------
  78 + |
  79 + | You may specify multiple password reset configurations if you have more
  80 + | than one user table or model in the application and you want to have
  81 + | separate password reset settings based on the specific user types.
  82 + |
  83 + | The expire time is the number of minutes that each reset token will be
  84 + | considered valid. This security feature keeps tokens short-lived so
  85 + | they have less time to be guessed. You may change this as needed.
  86 + |
  87 + */
  88 +
  89 + 'passwords' => [
  90 + 'users' => [
  91 + 'provider' => 'users',
  92 + 'table' => 'password_resets',
  93 + 'expire' => 60,
  94 + 'throttle' => 60,
  95 + ],
  96 + ],
  97 +
  98 + /*
  99 + |--------------------------------------------------------------------------
  100 + | Password Confirmation Timeout
  101 + |--------------------------------------------------------------------------
  102 + |
  103 + | Here you may define the amount of seconds before a password confirmation
  104 + | times out and the user is prompted to re-enter their password via the
  105 + | confirmation screen. By default, the timeout lasts for three hours.
  106 + |
  107 + */
  108 +
  109 + 'password_timeout' => 10800,
  110 +
  111 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Default Broadcaster
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This option controls the default broadcaster that will be used by the
  11 + | framework when an event needs to be broadcast. You may set this to
  12 + | any of the connections defined in the "connections" array below.
  13 + |
  14 + | Supported: "pusher", "ably", "redis", "log", "null"
  15 + |
  16 + */
  17 +
  18 + 'default' => env('BROADCAST_DRIVER', 'null'),
  19 +
  20 + /*
  21 + |--------------------------------------------------------------------------
  22 + | Broadcast Connections
  23 + |--------------------------------------------------------------------------
  24 + |
  25 + | Here you may define all of the broadcast connections that will be used
  26 + | to broadcast events to other systems or over websockets. Samples of
  27 + | each available type of connection are provided inside this array.
  28 + |
  29 + */
  30 +
  31 + 'connections' => [
  32 +
  33 + 'pusher' => [
  34 + 'driver' => 'pusher',
  35 + 'key' => env('PUSHER_APP_KEY'),
  36 + 'secret' => env('PUSHER_APP_SECRET'),
  37 + 'app_id' => env('PUSHER_APP_ID'),
  38 + 'options' => [
  39 + 'cluster' => env('PUSHER_APP_CLUSTER'),
  40 + 'useTLS' => true,
  41 + ],
  42 + ],
  43 +
  44 + 'ably' => [
  45 + 'driver' => 'ably',
  46 + 'key' => env('ABLY_KEY'),
  47 + ],
  48 +
  49 + 'redis' => [
  50 + 'driver' => 'redis',
  51 + 'connection' => 'default',
  52 + ],
  53 +
  54 + 'log' => [
  55 + 'driver' => 'log',
  56 + ],
  57 +
  58 + 'null' => [
  59 + 'driver' => 'null',
  60 + ],
  61 +
  62 + ],
  63 +
  64 +];
  1 +<?php
  2 +
  3 +use Illuminate\Support\Str;
  4 +
  5 +return [
  6 +
  7 + /*
  8 + |--------------------------------------------------------------------------
  9 + | Default Cache Store
  10 + |--------------------------------------------------------------------------
  11 + |
  12 + | This option controls the default cache connection that gets used while
  13 + | using this caching library. This connection is used when another is
  14 + | not explicitly specified when executing a given caching function.
  15 + |
  16 + */
  17 +
  18 + 'default' => env('CACHE_DRIVER', 'file'),
  19 +
  20 + /*
  21 + |--------------------------------------------------------------------------
  22 + | Cache Stores
  23 + |--------------------------------------------------------------------------
  24 + |
  25 + | Here you may define all of the cache "stores" for your application as
  26 + | well as their drivers. You may even define multiple stores for the
  27 + | same cache driver to group types of items stored in your caches.
  28 + |
  29 + | Supported drivers: "apc", "array", "database", "file",
  30 + | "memcached", "redis", "dynamodb", "octane", "null"
  31 + |
  32 + */
  33 +
  34 + 'stores' => [
  35 +
  36 + 'apc' => [
  37 + 'driver' => 'apc',
  38 + ],
  39 +
  40 + 'array' => [
  41 + 'driver' => 'array',
  42 + 'serialize' => false,
  43 + ],
  44 +
  45 + 'database' => [
  46 + 'driver' => 'database',
  47 + 'table' => 'cache',
  48 + 'connection' => null,
  49 + 'lock_connection' => null,
  50 + ],
  51 +
  52 + 'file' => [
  53 + 'driver' => 'file',
  54 + 'path' => storage_path('framework/cache/data'),
  55 + ],
  56 +
  57 + 'memcached' => [
  58 + 'driver' => 'memcached',
  59 + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
  60 + 'sasl' => [
  61 + env('MEMCACHED_USERNAME'),
  62 + env('MEMCACHED_PASSWORD'),
  63 + ],
  64 + 'options' => [
  65 + // Memcached::OPT_CONNECT_TIMEOUT => 2000,
  66 + ],
  67 + 'servers' => [
  68 + [
  69 + 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
  70 + 'port' => env('MEMCACHED_PORT', 11211),
  71 + 'weight' => 100,
  72 + ],
  73 + ],
  74 + ],
  75 +
  76 + 'redis' => [
  77 + 'driver' => 'redis',
  78 + 'connection' => 'cache',
  79 + 'lock_connection' => 'default',
  80 + ],
  81 +
  82 + 'dynamodb' => [
  83 + 'driver' => 'dynamodb',
  84 + 'key' => env('AWS_ACCESS_KEY_ID'),
  85 + 'secret' => env('AWS_SECRET_ACCESS_KEY'),
  86 + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
  87 + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
  88 + 'endpoint' => env('DYNAMODB_ENDPOINT'),
  89 + ],
  90 +
  91 + 'octane' => [
  92 + 'driver' => 'octane',
  93 + ],
  94 +
  95 + ],
  96 +
  97 + /*
  98 + |--------------------------------------------------------------------------
  99 + | Cache Key Prefix
  100 + |--------------------------------------------------------------------------
  101 + |
  102 + | When utilizing a RAM based store such as APC or Memcached, there might
  103 + | be other applications utilizing the same cache. So, we'll specify a
  104 + | value to get prefixed to all our keys so we can avoid collisions.
  105 + |
  106 + */
  107 +
  108 + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
  109 +
  110 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Cross-Origin Resource Sharing (CORS) Configuration
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | Here you may configure your settings for cross-origin resource sharing
  11 + | or "CORS". This determines what cross-origin operations may execute
  12 + | in web browsers. You are free to adjust these settings as needed.
  13 + |
  14 + | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
  15 + |
  16 + */
  17 +
  18 + 'paths' => ['api/*', 'sanctum/csrf-cookie'],
  19 +
  20 + 'allowed_methods' => ['*'],
  21 +
  22 + 'allowed_origins' => ['*'],
  23 +
  24 + 'allowed_origins_patterns' => [],
  25 +
  26 + 'allowed_headers' => ['*'],
  27 +
  28 + 'exposed_headers' => [],
  29 +
  30 + 'max_age' => 0,
  31 +
  32 + 'supports_credentials' => false,
  33 +
  34 +];
  1 +<?php
  2 +
  3 +use Illuminate\Support\Str;
  4 +
  5 +return [
  6 +
  7 + /*
  8 + |--------------------------------------------------------------------------
  9 + | Default Database Connection Name
  10 + |--------------------------------------------------------------------------
  11 + |
  12 + | Here you may specify which of the database connections below you wish
  13 + | to use as your default connection for all database work. Of course
  14 + | you may use many connections at once using the Database library.
  15 + |
  16 + */
  17 +
  18 + 'default' => env('DB_CONNECTION', 'mysql'),
  19 +
  20 + /*
  21 + |--------------------------------------------------------------------------
  22 + | Database Connections
  23 + |--------------------------------------------------------------------------
  24 + |
  25 + | Here are each of the database connections setup for your application.
  26 + | Of course, examples of configuring each database platform that is
  27 + | supported by Laravel is shown below to make development simple.
  28 + |
  29 + |
  30 + | All database work in Laravel is done through the PHP PDO facilities
  31 + | so make sure you have the driver for your particular database of
  32 + | choice installed on your machine before you begin development.
  33 + |
  34 + */
  35 +
  36 + 'connections' => [
  37 +
  38 + 'sqlite' => [
  39 + 'driver' => 'sqlite',
  40 + 'url' => env('DATABASE_URL'),
  41 + 'database' => env('DB_DATABASE', database_path('database.sqlite')),
  42 + 'prefix' => '',
  43 + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
  44 + ],
  45 +
  46 + 'mysql' => [
  47 + 'driver' => 'mysql',
  48 + 'url' => env('DATABASE_URL'),
  49 + 'host' => env('DB_HOST', '127.0.0.1'),
  50 + 'port' => env('DB_PORT', '3306'),
  51 + 'database' => env('DB_DATABASE', 'forge'),
  52 + 'username' => env('DB_USERNAME', 'forge'),
  53 + 'password' => env('DB_PASSWORD', ''),
  54 + 'unix_socket' => env('DB_SOCKET', ''),
  55 + 'charset' => 'utf8mb4',
  56 + 'collation' => 'utf8mb4_unicode_ci',
  57 + 'prefix' => '',
  58 + 'prefix_indexes' => true,
  59 + 'strict' => true,
  60 + 'engine' => null,
  61 + 'options' => extension_loaded('pdo_mysql') ? array_filter([
  62 + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
  63 + ]) : [],
  64 + ],
  65 +
  66 + 'pgsql' => [
  67 + 'driver' => 'pgsql',
  68 + 'url' => env('DATABASE_URL'),
  69 + 'host' => env('DB_HOST', '127.0.0.1'),
  70 + 'port' => env('DB_PORT', '5432'),
  71 + 'database' => env('DB_DATABASE', 'forge'),
  72 + 'username' => env('DB_USERNAME', 'forge'),
  73 + 'password' => env('DB_PASSWORD', ''),
  74 + 'charset' => 'utf8',
  75 + 'prefix' => '',
  76 + 'prefix_indexes' => true,
  77 + 'schema' => 'public',
  78 + 'sslmode' => 'prefer',
  79 + ],
  80 +
  81 + 'sqlsrv' => [
  82 + 'driver' => 'sqlsrv',
  83 + 'url' => env('DATABASE_URL'),
  84 + 'host' => env('DB_HOST', 'localhost'),
  85 + 'port' => env('DB_PORT', '1433'),
  86 + 'database' => env('DB_DATABASE', 'forge'),
  87 + 'username' => env('DB_USERNAME', 'forge'),
  88 + 'password' => env('DB_PASSWORD', ''),
  89 + 'charset' => 'utf8',
  90 + 'prefix' => '',
  91 + 'prefix_indexes' => true,
  92 + ],
  93 +
  94 + ],
  95 +
  96 + /*
  97 + |--------------------------------------------------------------------------
  98 + | Migration Repository Table
  99 + |--------------------------------------------------------------------------
  100 + |
  101 + | This table keeps track of all the migrations that have already run for
  102 + | your application. Using this information, we can determine which of
  103 + | the migrations on disk haven't actually been run in the database.
  104 + |
  105 + */
  106 +
  107 + 'migrations' => 'migrations',
  108 +
  109 + /*
  110 + |--------------------------------------------------------------------------
  111 + | Redis Databases
  112 + |--------------------------------------------------------------------------
  113 + |
  114 + | Redis is an open source, fast, and advanced key-value store that also
  115 + | provides a richer body of commands than a typical key-value system
  116 + | such as APC or Memcached. Laravel makes it easy to dig right in.
  117 + |
  118 + */
  119 +
  120 + 'redis' => [
  121 +
  122 + 'client' => env('REDIS_CLIENT', 'phpredis'),
  123 +
  124 + 'options' => [
  125 + 'cluster' => env('REDIS_CLUSTER', 'redis'),
  126 + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
  127 + ],
  128 +
  129 + 'default' => [
  130 + 'url' => env('REDIS_URL'),
  131 + 'host' => env('REDIS_HOST', '127.0.0.1'),
  132 + 'password' => env('REDIS_PASSWORD', null),
  133 + 'port' => env('REDIS_PORT', '6379'),
  134 + 'database' => env('REDIS_DB', '0'),
  135 + ],
  136 +
  137 + 'cache' => [
  138 + 'url' => env('REDIS_URL'),
  139 + 'host' => env('REDIS_HOST', '127.0.0.1'),
  140 + 'password' => env('REDIS_PASSWORD', null),
  141 + 'port' => env('REDIS_PORT', '6379'),
  142 + 'database' => env('REDIS_CACHE_DB', '1'),
  143 + ],
  144 +
  145 + ],
  146 +
  147 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Default Filesystem Disk
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | Here you may specify the default filesystem disk that should be used
  11 + | by the framework. The "local" disk, as well as a variety of cloud
  12 + | based disks are available to your application. Just store away!
  13 + |
  14 + */
  15 +
  16 + 'default' => env('FILESYSTEM_DRIVER', 'local'),
  17 +
  18 + /*
  19 + |--------------------------------------------------------------------------
  20 + | Filesystem Disks
  21 + |--------------------------------------------------------------------------
  22 + |
  23 + | Here you may configure as many filesystem "disks" as you wish, and you
  24 + | may even configure multiple disks of the same driver. Defaults have
  25 + | been setup for each driver as an example of the required options.
  26 + |
  27 + | Supported Drivers: "local", "ftp", "sftp", "s3"
  28 + |
  29 + */
  30 +
  31 + 'disks' => [
  32 +
  33 + 'local' => [
  34 + 'driver' => 'local',
  35 + 'root' => storage_path('app'),
  36 + ],
  37 +
  38 + 'public' => [
  39 + 'driver' => 'local',
  40 + 'root' => storage_path('app/public'),
  41 + 'url' => env('APP_URL').'/storage',
  42 + 'visibility' => 'public',
  43 + ],
  44 +
  45 + 's3' => [
  46 + 'driver' => 's3',
  47 + 'key' => env('AWS_ACCESS_KEY_ID'),
  48 + 'secret' => env('AWS_SECRET_ACCESS_KEY'),
  49 + 'region' => env('AWS_DEFAULT_REGION'),
  50 + 'bucket' => env('AWS_BUCKET'),
  51 + 'url' => env('AWS_URL'),
  52 + 'endpoint' => env('AWS_ENDPOINT'),
  53 + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
  54 + ],
  55 +
  56 + ],
  57 +
  58 + /*
  59 + |--------------------------------------------------------------------------
  60 + | Symbolic Links
  61 + |--------------------------------------------------------------------------
  62 + |
  63 + | Here you may configure the symbolic links that will be created when the
  64 + | `storage:link` Artisan command is executed. The array keys should be
  65 + | the locations of the links and the values should be their targets.
  66 + |
  67 + */
  68 +
  69 + 'links' => [
  70 + public_path('storage') => storage_path('app/public'),
  71 + ],
  72 +
  73 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Default Hash Driver
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This option controls the default hash driver that will be used to hash
  11 + | passwords for your application. By default, the bcrypt algorithm is
  12 + | used; however, you remain free to modify this option if you wish.
  13 + |
  14 + | Supported: "bcrypt", "argon", "argon2id"
  15 + |
  16 + */
  17 +
  18 + 'driver' => 'bcrypt',
  19 +
  20 + /*
  21 + |--------------------------------------------------------------------------
  22 + | Bcrypt Options
  23 + |--------------------------------------------------------------------------
  24 + |
  25 + | Here you may specify the configuration options that should be used when
  26 + | passwords are hashed using the Bcrypt algorithm. This will allow you
  27 + | to control the amount of time it takes to hash the given password.
  28 + |
  29 + */
  30 +
  31 + 'bcrypt' => [
  32 + 'rounds' => env('BCRYPT_ROUNDS', 10),
  33 + ],
  34 +
  35 + /*
  36 + |--------------------------------------------------------------------------
  37 + | Argon Options
  38 + |--------------------------------------------------------------------------
  39 + |
  40 + | Here you may specify the configuration options that should be used when
  41 + | passwords are hashed using the Argon algorithm. These will allow you
  42 + | to control the amount of time it takes to hash the given password.
  43 + |
  44 + */
  45 +
  46 + 'argon' => [
  47 + 'memory' => 65536,
  48 + 'threads' => 1,
  49 + 'time' => 4,
  50 + ],
  51 +
  52 +];
  1 +<?php
  2 +
  3 +use Monolog\Handler\NullHandler;
  4 +use Monolog\Handler\StreamHandler;
  5 +use Monolog\Handler\SyslogUdpHandler;
  6 +
  7 +return [
  8 +
  9 + /*
  10 + |--------------------------------------------------------------------------
  11 + | Default Log Channel
  12 + |--------------------------------------------------------------------------
  13 + |
  14 + | This option defines the default log channel that gets used when writing
  15 + | messages to the logs. The name specified in this option should match
  16 + | one of the channels defined in the "channels" configuration array.
  17 + |
  18 + */
  19 +
  20 + 'default' => env('LOG_CHANNEL', 'stack'),
  21 +
  22 + /*
  23 + |--------------------------------------------------------------------------
  24 + | Deprecations Log Channel
  25 + |--------------------------------------------------------------------------
  26 + |
  27 + | This option controls the log channel that should be used to log warnings
  28 + | regarding deprecated PHP and library features. This allows you to get
  29 + | your application ready for upcoming major versions of dependencies.
  30 + |
  31 + */
  32 +
  33 + 'deprecations' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
  34 +
  35 + /*
  36 + |--------------------------------------------------------------------------
  37 + | Log Channels
  38 + |--------------------------------------------------------------------------
  39 + |
  40 + | Here you may configure the log channels for your application. Out of
  41 + | the box, Laravel uses the Monolog PHP logging library. This gives
  42 + | you a variety of powerful log handlers / formatters to utilize.
  43 + |
  44 + | Available Drivers: "single", "daily", "slack", "syslog",
  45 + | "errorlog", "monolog",
  46 + | "custom", "stack"
  47 + |
  48 + */
  49 +
  50 + 'channels' => [
  51 + //自定义A端错误日志
  52 + 'aside' => [
  53 + 'driver' => 'custom',
  54 + 'via' => \App\Factory\LogFormatterFactory::class,
  55 + 'prefix' => 'aside',
  56 + ],
  57 + //自定义B端错误日志
  58 + 'bside' => [
  59 + 'driver' => 'custom',
  60 + 'via' => \App\Factory\LogFormatterFactory::class,
  61 + 'prefix' => 'bside',
  62 + ],
  63 +
  64 + 'stack' => [
  65 + 'driver' => 'stack',
  66 + 'channels' => ['single'],
  67 + 'ignore_exceptions' => false,
  68 + ],
  69 +
  70 + 'single' => [
  71 + 'driver' => 'single',
  72 + 'path' => storage_path('logs/laravel.log'),
  73 + 'level' => env('LOG_LEVEL', 'debug'),
  74 + ],
  75 +
  76 + 'daily' => [
  77 + 'driver' => 'daily',
  78 + 'path' => storage_path('logs/laravel.log'),
  79 + 'level' => env('LOG_LEVEL', 'debug'),
  80 + 'days' => 14,
  81 + ],
  82 +
  83 + 'slack' => [
  84 + 'driver' => 'slack',
  85 + 'url' => env('LOG_SLACK_WEBHOOK_URL'),
  86 + 'username' => 'Laravel Log',
  87 + 'emoji' => ':boom:',
  88 + 'level' => env('LOG_LEVEL', 'critical'),
  89 + ],
  90 +
  91 + 'papertrail' => [
  92 + 'driver' => 'monolog',
  93 + 'level' => env('LOG_LEVEL', 'debug'),
  94 + 'handler' => SyslogUdpHandler::class,
  95 + 'handler_with' => [
  96 + 'host' => env('PAPERTRAIL_URL'),
  97 + 'port' => env('PAPERTRAIL_PORT'),
  98 + ],
  99 + ],
  100 +
  101 + 'stderr' => [
  102 + 'driver' => 'monolog',
  103 + 'level' => env('LOG_LEVEL', 'debug'),
  104 + 'handler' => StreamHandler::class,
  105 + 'formatter' => env('LOG_STDERR_FORMATTER'),
  106 + 'with' => [
  107 + 'stream' => 'php://stderr',
  108 + ],
  109 + ],
  110 +
  111 + 'syslog' => [
  112 + 'driver' => 'syslog',
  113 + 'level' => env('LOG_LEVEL', 'debug'),
  114 + ],
  115 +
  116 + 'errorlog' => [
  117 + 'driver' => 'errorlog',
  118 + 'level' => env('LOG_LEVEL', 'debug'),
  119 + ],
  120 +
  121 + 'null' => [
  122 + 'driver' => 'monolog',
  123 + 'handler' => NullHandler::class,
  124 + ],
  125 +
  126 + 'emergency' => [
  127 + 'path' => storage_path('logs/laravel.log'),
  128 + ],
  129 + ],
  130 +
  131 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Default Mailer
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This option controls the default mailer that is used to send any email
  11 + | messages sent by your application. Alternative mailers may be setup
  12 + | and used as needed; however, this mailer will be used by default.
  13 + |
  14 + */
  15 +
  16 + 'default' => env('MAIL_MAILER', 'smtp'),
  17 +
  18 + /*
  19 + |--------------------------------------------------------------------------
  20 + | Mailer Configurations
  21 + |--------------------------------------------------------------------------
  22 + |
  23 + | Here you may configure all of the mailers used by your application plus
  24 + | their respective settings. Several examples have been configured for
  25 + | you and you are free to add your own as your application requires.
  26 + |
  27 + | Laravel supports a variety of mail "transport" drivers to be used while
  28 + | sending an e-mail. You will specify which one you are using for your
  29 + | mailers below. You are free to add additional mailers as required.
  30 + |
  31 + | Supported: "smtp", "sendmail", "mailgun", "ses",
  32 + | "postmark", "log", "array", "failover"
  33 + |
  34 + */
  35 +
  36 + 'mailers' => [
  37 + 'smtp' => [
  38 + 'transport' => 'smtp',
  39 + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
  40 + 'port' => env('MAIL_PORT', 587),
  41 + 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
  42 + 'username' => env('MAIL_USERNAME'),
  43 + 'password' => env('MAIL_PASSWORD'),
  44 + 'timeout' => null,
  45 + 'auth_mode' => null,
  46 + ],
  47 +
  48 + 'ses' => [
  49 + 'transport' => 'ses',
  50 + ],
  51 +
  52 + 'mailgun' => [
  53 + 'transport' => 'mailgun',
  54 + ],
  55 +
  56 + 'postmark' => [
  57 + 'transport' => 'postmark',
  58 + ],
  59 +
  60 + 'sendmail' => [
  61 + 'transport' => 'sendmail',
  62 + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -t -i'),
  63 + ],
  64 +
  65 + 'log' => [
  66 + 'transport' => 'log',
  67 + 'channel' => env('MAIL_LOG_CHANNEL'),
  68 + ],
  69 +
  70 + 'array' => [
  71 + 'transport' => 'array',
  72 + ],
  73 +
  74 + 'failover' => [
  75 + 'transport' => 'failover',
  76 + 'mailers' => [
  77 + 'smtp',
  78 + 'log',
  79 + ],
  80 + ],
  81 + ],
  82 +
  83 + /*
  84 + |--------------------------------------------------------------------------
  85 + | Global "From" Address
  86 + |--------------------------------------------------------------------------
  87 + |
  88 + | You may wish for all e-mails sent by your application to be sent from
  89 + | the same address. Here, you may specify a name and address that is
  90 + | used globally for all e-mails that are sent by your application.
  91 + |
  92 + */
  93 +
  94 + 'from' => [
  95 + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
  96 + 'name' => env('MAIL_FROM_NAME', 'Example'),
  97 + ],
  98 +
  99 + /*
  100 + |--------------------------------------------------------------------------
  101 + | Markdown Mail Settings
  102 + |--------------------------------------------------------------------------
  103 + |
  104 + | If you are using Markdown based email rendering, you may configure your
  105 + | theme and component paths here, allowing you to customize the design
  106 + | of the emails. Or, you may simply stick with the Laravel defaults!
  107 + |
  108 + */
  109 +
  110 + 'markdown' => [
  111 + 'theme' => 'default',
  112 +
  113 + 'paths' => [
  114 + resource_path('views/vendor/mail'),
  115 + ],
  116 + ],
  117 +
  118 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Default Queue Connection Name
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | Laravel's queue API supports an assortment of back-ends via a single
  11 + | API, giving you convenient access to each back-end using the same
  12 + | syntax for every one. Here you may define a default connection.
  13 + |
  14 + */
  15 +
  16 + 'default' => env('QUEUE_CONNECTION', 'sync'),
  17 +
  18 + /*
  19 + |--------------------------------------------------------------------------
  20 + | Queue Connections
  21 + |--------------------------------------------------------------------------
  22 + |
  23 + | Here you may configure the connection information for each server that
  24 + | is used by your application. A default configuration has been added
  25 + | for each back-end shipped with Laravel. You are free to add more.
  26 + |
  27 + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
  28 + |
  29 + */
  30 +
  31 + 'connections' => [
  32 +
  33 + 'sync' => [
  34 + 'driver' => 'sync',
  35 + ],
  36 +
  37 + 'database' => [
  38 + 'driver' => 'database',
  39 + 'table' => 'jobs',
  40 + 'queue' => 'default',
  41 + 'retry_after' => 90,
  42 + 'after_commit' => false,
  43 + ],
  44 +
  45 + 'beanstalkd' => [
  46 + 'driver' => 'beanstalkd',
  47 + 'host' => 'localhost',
  48 + 'queue' => 'default',
  49 + 'retry_after' => 90,
  50 + 'block_for' => 0,
  51 + 'after_commit' => false,
  52 + ],
  53 +
  54 + 'sqs' => [
  55 + 'driver' => 'sqs',
  56 + 'key' => env('AWS_ACCESS_KEY_ID'),
  57 + 'secret' => env('AWS_SECRET_ACCESS_KEY'),
  58 + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
  59 + 'queue' => env('SQS_QUEUE', 'default'),
  60 + 'suffix' => env('SQS_SUFFIX'),
  61 + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
  62 + 'after_commit' => false,
  63 + ],
  64 +
  65 + 'redis' => [
  66 + 'driver' => 'redis',
  67 + 'connection' => 'default',
  68 + 'queue' => env('REDIS_QUEUE', 'default'),
  69 + 'retry_after' => 90,
  70 + 'block_for' => null,
  71 + 'after_commit' => false,
  72 + ],
  73 +
  74 + ],
  75 +
  76 + /*
  77 + |--------------------------------------------------------------------------
  78 + | Failed Queue Jobs
  79 + |--------------------------------------------------------------------------
  80 + |
  81 + | These options configure the behavior of failed queue job logging so you
  82 + | can control which database and table are used to store the jobs that
  83 + | have failed. You may change them to any database / table you wish.
  84 + |
  85 + */
  86 +
  87 + 'failed' => [
  88 + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
  89 + 'database' => env('DB_CONNECTION', 'mysql'),
  90 + 'table' => 'failed_jobs',
  91 + ],
  92 +
  93 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Stateful Domains
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | Requests from the following domains / hosts will receive stateful API
  11 + | authentication cookies. Typically, these should include your local
  12 + | and production domains which access your API via a frontend SPA.
  13 + |
  14 + */
  15 +
  16 + 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
  17 + '%s%s',
  18 + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
  19 + env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
  20 + ))),
  21 +
  22 + /*
  23 + |--------------------------------------------------------------------------
  24 + | Sanctum Guards
  25 + |--------------------------------------------------------------------------
  26 + |
  27 + | This array contains the authentication guards that will be checked when
  28 + | Sanctum is trying to authenticate a request. If none of these guards
  29 + | are able to authenticate the request, Sanctum will use the bearer
  30 + | token that's present on an incoming request for authentication.
  31 + |
  32 + */
  33 +
  34 + 'guard' => ['web'],
  35 +
  36 + /*
  37 + |--------------------------------------------------------------------------
  38 + | Expiration Minutes
  39 + |--------------------------------------------------------------------------
  40 + |
  41 + | This value controls the number of minutes until an issued token will be
  42 + | considered expired. If this value is null, personal access tokens do
  43 + | not expire. This won't tweak the lifetime of first-party sessions.
  44 + |
  45 + */
  46 +
  47 + 'expiration' => null,
  48 +
  49 + /*
  50 + |--------------------------------------------------------------------------
  51 + | Sanctum Middleware
  52 + |--------------------------------------------------------------------------
  53 + |
  54 + | When authenticating your first-party SPA with Sanctum you may need to
  55 + | customize some of the middleware Sanctum uses while processing the
  56 + | request. You may change the middleware listed below as required.
  57 + |
  58 + */
  59 +
  60 + 'middleware' => [
  61 + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
  62 + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
  63 + ],
  64 +
  65 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Third Party Services
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | This file is for storing the credentials for third party services such
  11 + | as Mailgun, Postmark, AWS and more. This file provides the de facto
  12 + | location for this type of information, allowing packages to have
  13 + | a conventional file to locate the various service credentials.
  14 + |
  15 + */
  16 +
  17 + 'mailgun' => [
  18 + 'domain' => env('MAILGUN_DOMAIN'),
  19 + 'secret' => env('MAILGUN_SECRET'),
  20 + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
  21 + ],
  22 +
  23 + 'postmark' => [
  24 + 'token' => env('POSTMARK_TOKEN'),
  25 + ],
  26 +
  27 + 'ses' => [
  28 + 'key' => env('AWS_ACCESS_KEY_ID'),
  29 + 'secret' => env('AWS_SECRET_ACCESS_KEY'),
  30 + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
  31 + ],
  32 +
  33 +];
  1 +<?php
  2 +
  3 +use Illuminate\Support\Str;
  4 +
  5 +return [
  6 +
  7 + /*
  8 + |--------------------------------------------------------------------------
  9 + | Default Session Driver
  10 + |--------------------------------------------------------------------------
  11 + |
  12 + | This option controls the default session "driver" that will be used on
  13 + | requests. By default, we will use the lightweight native driver but
  14 + | you may specify any of the other wonderful drivers provided here.
  15 + |
  16 + | Supported: "file", "cookie", "database", "apc",
  17 + | "memcached", "redis", "dynamodb", "array"
  18 + |
  19 + */
  20 +
  21 + 'driver' => env('SESSION_DRIVER', 'file'),
  22 +
  23 + /*
  24 + |--------------------------------------------------------------------------
  25 + | Session Lifetime
  26 + |--------------------------------------------------------------------------
  27 + |
  28 + | Here you may specify the number of minutes that you wish the session
  29 + | to be allowed to remain idle before it expires. If you want them
  30 + | to immediately expire on the browser closing, set that option.
  31 + |
  32 + */
  33 +
  34 + 'lifetime' => env('SESSION_LIFETIME', 120),
  35 +
  36 + 'expire_on_close' => false,
  37 +
  38 + /*
  39 + |--------------------------------------------------------------------------
  40 + | Session Encryption
  41 + |--------------------------------------------------------------------------
  42 + |
  43 + | This option allows you to easily specify that all of your session data
  44 + | should be encrypted before it is stored. All encryption will be run
  45 + | automatically by Laravel and you can use the Session like normal.
  46 + |
  47 + */
  48 +
  49 + 'encrypt' => false,
  50 +
  51 + /*
  52 + |--------------------------------------------------------------------------
  53 + | Session File Location
  54 + |--------------------------------------------------------------------------
  55 + |
  56 + | When using the native session driver, we need a location where session
  57 + | files may be stored. A default has been set for you but a different
  58 + | location may be specified. This is only needed for file sessions.
  59 + |
  60 + */
  61 +
  62 + 'files' => storage_path('framework/sessions'),
  63 +
  64 + /*
  65 + |--------------------------------------------------------------------------
  66 + | Session Database Connection
  67 + |--------------------------------------------------------------------------
  68 + |
  69 + | When using the "database" or "redis" session drivers, you may specify a
  70 + | connection that should be used to manage these sessions. This should
  71 + | correspond to a connection in your database configuration options.
  72 + |
  73 + */
  74 +
  75 + 'connection' => env('SESSION_CONNECTION', null),
  76 +
  77 + /*
  78 + |--------------------------------------------------------------------------
  79 + | Session Database Table
  80 + |--------------------------------------------------------------------------
  81 + |
  82 + | When using the "database" session driver, you may specify the table we
  83 + | should use to manage the sessions. Of course, a sensible default is
  84 + | provided for you; however, you are free to change this as needed.
  85 + |
  86 + */
  87 +
  88 + 'table' => 'sessions',
  89 +
  90 + /*
  91 + |--------------------------------------------------------------------------
  92 + | Session Cache Store
  93 + |--------------------------------------------------------------------------
  94 + |
  95 + | While using one of the framework's cache driven session backends you may
  96 + | list a cache store that should be used for these sessions. This value
  97 + | must match with one of the application's configured cache "stores".
  98 + |
  99 + | Affects: "apc", "dynamodb", "memcached", "redis"
  100 + |
  101 + */
  102 +
  103 + 'store' => env('SESSION_STORE', null),
  104 +
  105 + /*
  106 + |--------------------------------------------------------------------------
  107 + | Session Sweeping Lottery
  108 + |--------------------------------------------------------------------------
  109 + |
  110 + | Some session drivers must manually sweep their storage location to get
  111 + | rid of old sessions from storage. Here are the chances that it will
  112 + | happen on a given request. By default, the odds are 2 out of 100.
  113 + |
  114 + */
  115 +
  116 + 'lottery' => [2, 100],
  117 +
  118 + /*
  119 + |--------------------------------------------------------------------------
  120 + | Session Cookie Name
  121 + |--------------------------------------------------------------------------
  122 + |
  123 + | Here you may change the name of the cookie used to identify a session
  124 + | instance by ID. The name specified here will get used every time a
  125 + | new session cookie is created by the framework for every driver.
  126 + |
  127 + */
  128 +
  129 + 'cookie' => env(
  130 + 'SESSION_COOKIE',
  131 + Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
  132 + ),
  133 +
  134 + /*
  135 + |--------------------------------------------------------------------------
  136 + | Session Cookie Path
  137 + |--------------------------------------------------------------------------
  138 + |
  139 + | The session cookie path determines the path for which the cookie will
  140 + | be regarded as available. Typically, this will be the root path of
  141 + | your application but you are free to change this when necessary.
  142 + |
  143 + */
  144 +
  145 + 'path' => '/',
  146 +
  147 + /*
  148 + |--------------------------------------------------------------------------
  149 + | Session Cookie Domain
  150 + |--------------------------------------------------------------------------
  151 + |
  152 + | Here you may change the domain of the cookie used to identify a session
  153 + | in your application. This will determine which domains the cookie is
  154 + | available to in your application. A sensible default has been set.
  155 + |
  156 + */
  157 +
  158 + 'domain' => env('SESSION_DOMAIN', null),
  159 +
  160 + /*
  161 + |--------------------------------------------------------------------------
  162 + | HTTPS Only Cookies
  163 + |--------------------------------------------------------------------------
  164 + |
  165 + | By setting this option to true, session cookies will only be sent back
  166 + | to the server if the browser has a HTTPS connection. This will keep
  167 + | the cookie from being sent to you when it can't be done securely.
  168 + |
  169 + */
  170 +
  171 + 'secure' => env('SESSION_SECURE_COOKIE'),
  172 +
  173 + /*
  174 + |--------------------------------------------------------------------------
  175 + | HTTP Access Only
  176 + |--------------------------------------------------------------------------
  177 + |
  178 + | Setting this value to true will prevent JavaScript from accessing the
  179 + | value of the cookie and the cookie will only be accessible through
  180 + | the HTTP protocol. You are free to modify this option if needed.
  181 + |
  182 + */
  183 +
  184 + 'http_only' => true,
  185 +
  186 + /*
  187 + |--------------------------------------------------------------------------
  188 + | Same-Site Cookies
  189 + |--------------------------------------------------------------------------
  190 + |
  191 + | This option determines how your cookies behave when cross-site requests
  192 + | take place, and can be used to mitigate CSRF attacks. By default, we
  193 + | will set this value to "lax" since this is a secure default value.
  194 + |
  195 + | Supported: "lax", "strict", "none", null
  196 + |
  197 + */
  198 +
  199 + 'same_site' => 'lax',
  200 +
  201 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | View Storage Paths
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | Most templating systems load templates from disk. Here you may specify
  11 + | an array of paths that should be checked for your views. Of course
  12 + | the usual Laravel view path has already been registered for you.
  13 + |
  14 + */
  15 +
  16 + 'paths' => [
  17 + resource_path('views'),
  18 + ],
  19 +
  20 + /*
  21 + |--------------------------------------------------------------------------
  22 + | Compiled View Path
  23 + |--------------------------------------------------------------------------
  24 + |
  25 + | This option determines where all the compiled Blade templates will be
  26 + | stored for your application. Typically, this is within the storage
  27 + | directory. However, as usual, you are free to change this value.
  28 + |
  29 + */
  30 +
  31 + 'compiled' => env(
  32 + 'VIEW_COMPILED_PATH',
  33 + realpath(storage_path('framework/views'))
  34 + ),
  35 +
  36 +];
  1 +<?php
  2 +
  3 +namespace Database\Factories;
  4 +
  5 +use Illuminate\Database\Eloquent\Factories\Factory;
  6 +use Illuminate\Support\Str;
  7 +
  8 +class UserFactory extends Factory
  9 +{
  10 + /**
  11 + * Define the model's default state.
  12 + *
  13 + * @return array
  14 + */
  15 + public function definition()
  16 + {
  17 + return [
  18 + 'name' => $this->faker->name(),
  19 + 'email' => $this->faker->unique()->safeEmail(),
  20 + 'email_verified_at' => now(),
  21 + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
  22 + 'remember_token' => Str::random(10),
  23 + ];
  24 + }
  25 +
  26 + /**
  27 + * Indicate that the model's email address should be unverified.
  28 + *
  29 + * @return \Illuminate\Database\Eloquent\Factories\Factory
  30 + */
  31 + public function unverified()
  32 + {
  33 + return $this->state(function (array $attributes) {
  34 + return [
  35 + 'email_verified_at' => null,
  36 + ];
  37 + });
  38 + }
  39 +}
  1 +<?php
  2 +
  3 +use Illuminate\Database\Migrations\Migration;
  4 +use Illuminate\Database\Schema\Blueprint;
  5 +use Illuminate\Support\Facades\Schema;
  6 +
  7 +class CreateUsersTable extends Migration
  8 +{
  9 + /**
  10 + * Run the migrations.
  11 + *
  12 + * @return void
  13 + */
  14 + public function up()
  15 + {
  16 + Schema::create('users', function (Blueprint $table) {
  17 + $table->id();
  18 + $table->string('name');
  19 + $table->string('email')->unique();
  20 + $table->timestamp('email_verified_at')->nullable();
  21 + $table->string('password');
  22 + $table->rememberToken();
  23 + $table->timestamps();
  24 + });
  25 + }
  26 +
  27 + /**
  28 + * Reverse the migrations.
  29 + *
  30 + * @return void
  31 + */
  32 + public function down()
  33 + {
  34 + Schema::dropIfExists('users');
  35 + }
  36 +}
  1 +<?php
  2 +
  3 +use Illuminate\Database\Migrations\Migration;
  4 +use Illuminate\Database\Schema\Blueprint;
  5 +use Illuminate\Support\Facades\Schema;
  6 +
  7 +class CreatePasswordResetsTable extends Migration
  8 +{
  9 + /**
  10 + * Run the migrations.
  11 + *
  12 + * @return void
  13 + */
  14 + public function up()
  15 + {
  16 + Schema::create('password_resets', function (Blueprint $table) {
  17 + $table->string('email')->index();
  18 + $table->string('token');
  19 + $table->timestamp('created_at')->nullable();
  20 + });
  21 + }
  22 +
  23 + /**
  24 + * Reverse the migrations.
  25 + *
  26 + * @return void
  27 + */
  28 + public function down()
  29 + {
  30 + Schema::dropIfExists('password_resets');
  31 + }
  32 +}
  1 +<?php
  2 +
  3 +use Illuminate\Database\Migrations\Migration;
  4 +use Illuminate\Database\Schema\Blueprint;
  5 +use Illuminate\Support\Facades\Schema;
  6 +
  7 +class CreateFailedJobsTable extends Migration
  8 +{
  9 + /**
  10 + * Run the migrations.
  11 + *
  12 + * @return void
  13 + */
  14 + public function up()
  15 + {
  16 + Schema::create('failed_jobs', function (Blueprint $table) {
  17 + $table->id();
  18 + $table->string('uuid')->unique();
  19 + $table->text('connection');
  20 + $table->text('queue');
  21 + $table->longText('payload');
  22 + $table->longText('exception');
  23 + $table->timestamp('failed_at')->useCurrent();
  24 + });
  25 + }
  26 +
  27 + /**
  28 + * Reverse the migrations.
  29 + *
  30 + * @return void
  31 + */
  32 + public function down()
  33 + {
  34 + Schema::dropIfExists('failed_jobs');
  35 + }
  36 +}
  1 +<?php
  2 +
  3 +use Illuminate\Database\Migrations\Migration;
  4 +use Illuminate\Database\Schema\Blueprint;
  5 +use Illuminate\Support\Facades\Schema;
  6 +
  7 +class CreatePersonalAccessTokensTable extends Migration
  8 +{
  9 + /**
  10 + * Run the migrations.
  11 + *
  12 + * @return void
  13 + */
  14 + public function up()
  15 + {
  16 + Schema::create('personal_access_tokens', function (Blueprint $table) {
  17 + $table->id();
  18 + $table->morphs('tokenable');
  19 + $table->string('name');
  20 + $table->string('token', 64)->unique();
  21 + $table->text('abilities')->nullable();
  22 + $table->timestamp('last_used_at')->nullable();
  23 + $table->timestamps();
  24 + });
  25 + }
  26 +
  27 + /**
  28 + * Reverse the migrations.
  29 + *
  30 + * @return void
  31 + */
  32 + public function down()
  33 + {
  34 + Schema::dropIfExists('personal_access_tokens');
  35 + }
  36 +}
  1 +<?php
  2 +
  3 +namespace Database\Seeders;
  4 +
  5 +use Illuminate\Database\Seeder;
  6 +
  7 +class DatabaseSeeder extends Seeder
  8 +{
  9 + /**
  10 + * Seed the application's database.
  11 + *
  12 + * @return void
  13 + */
  14 + public function run()
  15 + {
  16 + // \App\Models\User::factory(10)->create();
  17 + }
  18 +}
  1 +{
  2 + "private": true,
  3 + "scripts": {
  4 + "dev": "npm run development",
  5 + "development": "mix",
  6 + "watch": "mix watch",
  7 + "watch-poll": "mix watch -- --watch-options-poll=1000",
  8 + "hot": "mix watch --hot",
  9 + "prod": "npm run production",
  10 + "production": "mix --production"
  11 + },
  12 + "devDependencies": {
  13 + "axios": "^0.21",
  14 + "laravel-mix": "^6.0.6",
  15 + "lodash": "^4.17.19",
  16 + "postcss": "^8.1.14"
  17 + }
  18 +}
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
  4 + bootstrap="vendor/autoload.php"
  5 + colors="true"
  6 +>
  7 + <testsuites>
  8 + <testsuite name="Unit">
  9 + <directory suffix="Test.php">./tests/Unit</directory>
  10 + </testsuite>
  11 + <testsuite name="Feature">
  12 + <directory suffix="Test.php">./tests/Feature</directory>
  13 + </testsuite>
  14 + </testsuites>
  15 + <coverage processUncoveredFiles="true">
  16 + <include>
  17 + <directory suffix=".php">./app</directory>
  18 + </include>
  19 + </coverage>
  20 + <php>
  21 + <server name="APP_ENV" value="testing"/>
  22 + <server name="BCRYPT_ROUNDS" value="4"/>
  23 + <server name="CACHE_DRIVER" value="array"/>
  24 + <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
  25 + <!-- <server name="DB_DATABASE" value=":memory:"/> -->
  26 + <server name="MAIL_MAILER" value="array"/>
  27 + <server name="QUEUE_CONNECTION" value="sync"/>
  28 + <server name="SESSION_DRIVER" value="array"/>
  29 + <server name="TELESCOPE_ENABLED" value="false"/>
  30 + </php>
  31 +</phpunit>
  1 +<IfModule mod_rewrite.c>
  2 + <IfModule mod_negotiation.c>
  3 + Options -MultiViews -Indexes
  4 + </IfModule>
  5 +
  6 + RewriteEngine On
  7 +
  8 + # Handle Authorization Header
  9 + RewriteCond %{HTTP:Authorization} .
  10 + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  11 +
  12 + # Redirect Trailing Slashes If Not A Folder...
  13 + RewriteCond %{REQUEST_FILENAME} !-d
  14 + RewriteCond %{REQUEST_URI} (.+)/$
  15 + RewriteRule ^ %1 [L,R=301]
  16 +
  17 + # Send Requests To Front Controller...
  18 + RewriteCond %{REQUEST_FILENAME} !-d
  19 + RewriteCond %{REQUEST_FILENAME} !-f
  20 + RewriteRule ^ index.php [L]
  21 +</IfModule>
  1 +<?php
  2 +
  3 +use Illuminate\Contracts\Http\Kernel;
  4 +use Illuminate\Http\Request;
  5 +
  6 +define('LARAVEL_START', microtime(true));
  7 +
  8 +/*
  9 +|--------------------------------------------------------------------------
  10 +| Check If The Application Is Under Maintenance
  11 +|--------------------------------------------------------------------------
  12 +|
  13 +| If the application is in maintenance / demo mode via the "down" command
  14 +| we will load this file so that any pre-rendered content can be shown
  15 +| instead of starting the framework, which could cause an exception.
  16 +|
  17 +*/
  18 +
  19 +if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
  20 + require $maintenance;
  21 +}
  22 +
  23 +/*
  24 +|--------------------------------------------------------------------------
  25 +| Register The Auto Loader
  26 +|--------------------------------------------------------------------------
  27 +|
  28 +| Composer provides a convenient, automatically generated class loader for
  29 +| this application. We just need to utilize it! We'll simply require it
  30 +| into the script here so we don't need to manually load our classes.
  31 +|
  32 +*/
  33 +
  34 +require __DIR__.'/../vendor/autoload.php';
  35 +
  36 +/*
  37 +|--------------------------------------------------------------------------
  38 +| Run The Application
  39 +|--------------------------------------------------------------------------
  40 +|
  41 +| Once we have the application, we can handle the incoming request using
  42 +| the application's HTTP kernel. Then, we will send the response back
  43 +| to this client's browser, allowing them to enjoy our application.
  44 +|
  45 +*/
  46 +
  47 +$app = require_once __DIR__.'/../bootstrap/app.php';
  48 +
  49 +$kernel = $app->make(Kernel::class);
  50 +
  51 +$response = $kernel->handle(
  52 + $request = Request::capture()
  53 +)->send();
  54 +
  55 +$kernel->terminate($request, $response);
  1 +User-agent: *
  2 +Disallow:
  1 +require('./bootstrap');
  1 +window._ = require('lodash');
  2 +
  3 +/**
  4 + * We'll load the axios HTTP library which allows us to easily issue requests
  5 + * to our Laravel back-end. This library automatically handles sending the
  6 + * CSRF token as a header based on the value of the "XSRF" token cookie.
  7 + */
  8 +
  9 +window.axios = require('axios');
  10 +
  11 +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
  12 +
  13 +/**
  14 + * Echo exposes an expressive API for subscribing to channels and listening
  15 + * for events that are broadcast by Laravel. Echo and event broadcasting
  16 + * allows your team to easily build robust real-time web applications.
  17 + */
  18 +
  19 +// import Echo from 'laravel-echo';
  20 +
  21 +// window.Pusher = require('pusher-js');
  22 +
  23 +// window.Echo = new Echo({
  24 +// broadcaster: 'pusher',
  25 +// key: process.env.MIX_PUSHER_APP_KEY,
  26 +// cluster: process.env.MIX_PUSHER_APP_CLUSTER,
  27 +// forceTLS: true
  28 +// });
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Authentication Language Lines
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | The following language lines are used during authentication for various
  11 + | messages that we need to display to the user. You are free to modify
  12 + | these language lines according to your application's requirements.
  13 + |
  14 + */
  15 +
  16 + 'failed' => 'These credentials do not match our records.',
  17 + 'password' => 'The provided password is incorrect.',
  18 + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
  19 +
  20 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Pagination Language Lines
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | The following language lines are used by the paginator library to build
  11 + | the simple pagination links. You are free to change them to anything
  12 + | you want to customize your views to better match your application.
  13 + |
  14 + */
  15 +
  16 + 'previous' => '&laquo; Previous',
  17 + 'next' => 'Next &raquo;',
  18 +
  19 +];
  1 +<?php
  2 +
  3 +return [
  4 +
  5 + /*
  6 + |--------------------------------------------------------------------------
  7 + | Password Reset Language Lines
  8 + |--------------------------------------------------------------------------
  9 + |
  10 + | The following language lines are the default lines which match reasons
  11 + | that are given by the password broker for a password update attempt
  12 + | has failed, such as for an invalid token or invalid new password.
  13 + |
  14 + */
  15 +
  16 + 'reset' => 'Your password has been reset!',
  17 + 'sent' => 'We have emailed your password reset link!',
  18 + 'throttled' => 'Please wait before retrying.',
  19 + 'token' => 'This password reset token is invalid.',
  20 + 'user' => "We can't find a user with that email address.",
  21 +
  22 +];