正在显示
93 个修改的文件
包含
4567 行增加
和
0 行删除
.editorconfig
0 → 100644
| 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 |
.env.development
0 → 100644
| 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}" |
.env.production
0 → 100644
| 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}" |
.env.test
0 → 100644
| 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}" |
.gitattributes
0 → 100644
.gitignore
0 → 100644
.styleci.yml
0 → 100644
README.md
0 → 100644
| 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; |
app/Console/Kernel.php
0 → 100644
| 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 | +} |
app/Enums/Common/Code.php
0 → 100644
| 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 | +} |
app/Enums/Common/Common.php
0 → 100644
| 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 | +} |
app/Enums/Common/Demo.php
0 → 100644
| 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 | +} |
app/Enums/Common/RedisKey.php
0 → 100644
| 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 | +} |
app/Exceptions/AsideGlobalException.php
0 → 100644
| 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 | +} |
app/Exceptions/BsideGlobalException.php
0 → 100644
| 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 | +} |
app/Exceptions/Handler.php
0 → 100644
| 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 | +} |
app/Factory/LogFormatterFactory.php
0 → 100644
| 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 | +} |
app/Http/Controllers/Controller.php
0 → 100644
| 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 | +} |
app/Http/Kernel.php
0 → 100644
| 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 | +} |
app/Http/Logic/Aside/BaseLogic.php
0 → 100644
| 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 | +} |
app/Http/Logic/Aside/DemoLogic.php
0 → 100644
| 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 | +} |
app/Http/Logic/Bside/BaseLogic.php
0 → 100644
| 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 | +} |
app/Http/Middleware/Authenticate.php
0 → 100644
| 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 | +} |
app/Http/Middleware/EncryptCookies.php
0 → 100644
| 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 | +} |
app/Http/Middleware/TrimStrings.php
0 → 100644
| 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 | +} |
app/Http/Middleware/TrustHosts.php
0 → 100644
| 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 | +} |
app/Http/Middleware/TrustProxies.php
0 → 100644
| 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 | +} |
app/Http/Middleware/VerifyCsrfToken.php
0 → 100644
| 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 | +} |
app/Http/Requests/Aside/DemoRequest.php
0 → 100644
| 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 | +} |
app/Models/User.php
0 → 100644
| 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 | +} |
app/Providers/AppServiceProvider.php
0 → 100644
| 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 | +} |
app/Providers/AuthServiceProvider.php
0 → 100644
| 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 | +} |
app/Providers/BroadcastServiceProvider.php
0 → 100644
| 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 | +} |
app/Providers/EventServiceProvider.php
0 → 100644
| 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 | +} |
app/Providers/RouteServiceProvider.php
0 → 100644
| 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 | +} |
app/Services/BaseService.php
0 → 100644
| 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 | +} |
app/Services/DingService.php
0 → 100644
| 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 | +} |
app/Traits/RedisTrait.php
0 → 100644
| 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 | +} |
app/Utils/EncryptUtils.php
0 → 100644
| 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 | +} |
app/Utils/HttpUtils.php
0 → 100644
| 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 | +} |
app/Utils/LogUtils.php
0 → 100644
| 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 | +} |
app/Utils/RedisUtils.php
0 → 100644
| 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 | +} |
artisan
0 → 100644
| 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); |
bootstrap/app.php
0 → 100644
| 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; |
bootstrap/cache/.gitignore
0 → 100644
composer.json
0 → 100644
| 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 | +} |
composer.lock
0 → 100644
此 diff 太大无法显示。
config/app.php
0 → 100644
| 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 | +]; |
config/auth.php
0 → 100644
| 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 | +]; |
config/broadcasting.php
0 → 100644
| 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 | +]; |
config/cache.php
0 → 100644
| 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 | +]; |
config/cors.php
0 → 100644
| 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 | +]; |
config/database.php
0 → 100644
| 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 | +]; |
config/filesystems.php
0 → 100644
| 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 | +]; |
config/hashing.php
0 → 100644
| 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 | +]; |
config/logging.php
0 → 100644
| 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 | +]; |
config/mail.php
0 → 100644
| 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 | +]; |
config/queue.php
0 → 100644
| 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 | +]; |
config/sanctum.php
0 → 100644
| 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 | +]; |
config/services.php
0 → 100644
| 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 | +]; |
config/session.php
0 → 100644
| 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 | +]; |
config/view.php
0 → 100644
| 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 | +]; |
database/.gitignore
0 → 100644
| 1 | +*.sqlite* |
database/factories/UserFactory.php
0 → 100644
| 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 | +} |
database/seeders/DatabaseSeeder.php
0 → 100644
| 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 | +} |
package.json
0 → 100644
| 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 | +} |
phpunit.xml
0 → 100644
| 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> |
public/.htaccess
0 → 100644
| 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> |
public/favicon.ico
0 → 100644
public/index.php
0 → 100644
| 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); |
public/robots.txt
0 → 100644
resources/css/app.css
0 → 100644
resources/js/app.js
0 → 100644
| 1 | +require('./bootstrap'); |
resources/js/bootstrap.js
0 → 100644
| 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 | +// }); |
resources/lang/en/auth.php
0 → 100644
| 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 | +]; |
resources/lang/en/pagination.php
0 → 100644
| 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' => '« Previous', | ||
| 17 | + 'next' => 'Next »', | ||
| 18 | + | ||
| 19 | +]; |
resources/lang/en/passwords.php
0 → 100644
| 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 | +]; |
-
请 注册 或 登录 后发表评论