浏览代码

first create

父节点
当前提交
553f3841d9
共有 75 个文件被更改,包括 12879 次插入0 次删除
  1. 18
    0
      .editorconfig
  2. 65
    0
      .env.example
  3. 11
    0
      .gitattributes
  4. 24
    0
      .gitignore
  5. 8
    0
      app/Http/Controllers/Controller.php
  6. 48
    0
      app/Models/User.php
  7. 24
    0
      app/Providers/AppServiceProvider.php
  8. 59
    0
      app/Providers/Filament/AdminPanelProvider.php
  9. 18
    0
      artisan
  10. 18
    0
      bootstrap/app.php
  11. 2
    0
      bootstrap/cache/.gitignore
  12. 6
    0
      bootstrap/providers.php
  13. 77
    0
      composer.json
  14. 10069
    0
      composer.lock
  15. 126
    0
      config/app.php
  16. 115
    0
      config/auth.php
  17. 108
    0
      config/cache.php
  18. 183
    0
      config/database.php
  19. 80
    0
      config/filesystems.php
  20. 132
    0
      config/logging.php
  21. 118
    0
      config/mail.php
  22. 112
    0
      config/queue.php
  23. 38
    0
      config/services.php
  24. 217
    0
      config/session.php
  25. 1
    0
      database/.gitignore
  26. 44
    0
      database/factories/UserFactory.php
  27. 49
    0
      database/migrations/0001_01_01_000000_create_users_table.php
  28. 35
    0
      database/migrations/0001_01_01_000001_create_cache_table.php
  29. 57
    0
      database/migrations/0001_01_01_000002_create_jobs_table.php
  30. 23
    0
      database/seeders/DatabaseSeeder.php
  31. 17
    0
      package.json
  32. 34
    0
      phpunit.xml
  33. 25
    0
      public/.htaccess
  34. 1
    0
      public/css/filament/filament/app.css
  35. 49
    0
      public/css/filament/forms/forms.css
  36. 1
    0
      public/css/filament/support/support.css
  37. 0
    0
      public/favicon.ico
  38. 20
    0
      public/index.php
  39. 1
    0
      public/js/filament/filament/app.js
  40. 13
    0
      public/js/filament/filament/echo.js
  41. 1
    0
      public/js/filament/forms/components/color-picker.js
  42. 1
    0
      public/js/filament/forms/components/date-time-picker.js
  43. 123
    0
      public/js/filament/forms/components/file-upload.js
  44. 1
    0
      public/js/filament/forms/components/key-value.js
  45. 51
    0
      public/js/filament/forms/components/markdown-editor.js
  46. 150
    0
      public/js/filament/forms/components/rich-editor.js
  47. 6
    0
      public/js/filament/forms/components/select.js
  48. 1
    0
      public/js/filament/forms/components/tags-input.js
  49. 1
    0
      public/js/filament/forms/components/textarea.js
  50. 1
    0
      public/js/filament/notifications/notifications.js
  51. 46
    0
      public/js/filament/support/support.js
  52. 1
    0
      public/js/filament/tables/components/table.js
  53. 30
    0
      public/js/filament/widgets/components/chart.js
  54. 22
    0
      public/js/filament/widgets/components/stats-overview/stat/chart.js
  55. 2
    0
      public/robots.txt
  56. 11
    0
      resources/css/app.css
  57. 1
    0
      resources/js/app.js
  58. 4
    0
      resources/js/bootstrap.js
  59. 277
    0
      resources/views/welcome.blade.php
  60. 8
    0
      routes/console.php
  61. 7
    0
      routes/web.php
  62. 4
    0
      storage/app/.gitignore
  63. 2
    0
      storage/app/private/.gitignore
  64. 2
    0
      storage/app/public/.gitignore
  65. 9
    0
      storage/framework/.gitignore
  66. 3
    0
      storage/framework/cache/.gitignore
  67. 2
    0
      storage/framework/cache/data/.gitignore
  68. 2
    0
      storage/framework/sessions/.gitignore
  69. 2
    0
      storage/framework/testing/.gitignore
  70. 2
    0
      storage/framework/views/.gitignore
  71. 2
    0
      storage/logs/.gitignore
  72. 19
    0
      tests/Feature/ExampleTest.php
  73. 10
    0
      tests/TestCase.php
  74. 16
    0
      tests/Unit/ExampleTest.php
  75. 13
    0
      vite.config.js

+ 18
- 0
.editorconfig 查看文件

@@ -0,0 +1,18 @@
1
+root = true
2
+
3
+[*]
4
+charset = utf-8
5
+end_of_line = lf
6
+indent_size = 4
7
+indent_style = space
8
+insert_final_newline = true
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

+ 65
- 0
.env.example 查看文件

@@ -0,0 +1,65 @@
1
+APP_NAME=Laravel
2
+APP_ENV=local
3
+APP_KEY=
4
+APP_DEBUG=true
5
+APP_URL=http://localhost
6
+
7
+APP_LOCALE=en
8
+APP_FALLBACK_LOCALE=en
9
+APP_FAKER_LOCALE=en_US
10
+
11
+APP_MAINTENANCE_DRIVER=file
12
+# APP_MAINTENANCE_STORE=database
13
+
14
+PHP_CLI_SERVER_WORKERS=4
15
+
16
+BCRYPT_ROUNDS=12
17
+
18
+LOG_CHANNEL=stack
19
+LOG_STACK=single
20
+LOG_DEPRECATIONS_CHANNEL=null
21
+LOG_LEVEL=debug
22
+
23
+DB_CONNECTION=sqlite
24
+# DB_HOST=127.0.0.1
25
+# DB_PORT=3306
26
+# DB_DATABASE=honhui
27
+# DB_USERNAME=root
28
+# DB_PASSWORD=
29
+
30
+SESSION_DRIVER=database
31
+SESSION_LIFETIME=120
32
+SESSION_ENCRYPT=false
33
+SESSION_PATH=/
34
+SESSION_DOMAIN=null
35
+
36
+BROADCAST_CONNECTION=log
37
+FILESYSTEM_DISK=local
38
+QUEUE_CONNECTION=database
39
+
40
+CACHE_STORE=database
41
+# CACHE_PREFIX=
42
+
43
+MEMCACHED_HOST=127.0.0.1
44
+
45
+REDIS_CLIENT=phpredis
46
+REDIS_HOST=127.0.0.1
47
+REDIS_PASSWORD=null
48
+REDIS_PORT=6379
49
+
50
+MAIL_MAILER=log
51
+MAIL_SCHEME=null
52
+MAIL_HOST=127.0.0.1
53
+MAIL_PORT=2525
54
+MAIL_USERNAME=null
55
+MAIL_PASSWORD=null
56
+MAIL_FROM_ADDRESS="hello@example.com"
57
+MAIL_FROM_NAME="${APP_NAME}"
58
+
59
+AWS_ACCESS_KEY_ID=
60
+AWS_SECRET_ACCESS_KEY=
61
+AWS_DEFAULT_REGION=us-east-1
62
+AWS_BUCKET=
63
+AWS_USE_PATH_STYLE_ENDPOINT=false
64
+
65
+VITE_APP_NAME="${APP_NAME}"

+ 11
- 0
.gitattributes 查看文件

@@ -0,0 +1,11 @@
1
+* text=auto eol=lf
2
+
3
+*.blade.php diff=html
4
+*.css diff=css
5
+*.html diff=html
6
+*.md diff=markdown
7
+*.php diff=php
8
+
9
+/.github export-ignore
10
+CHANGELOG.md export-ignore
11
+.styleci.yml export-ignore

+ 24
- 0
.gitignore 查看文件

@@ -0,0 +1,24 @@
1
+*.log
2
+.DS_Store
3
+.env
4
+.env.backup
5
+.env.production
6
+.phpactor.json
7
+.phpunit.result.cache
8
+/.fleet
9
+/.idea
10
+/.nova
11
+/.phpunit.cache
12
+/.vscode
13
+/.zed
14
+/auth.json
15
+/node_modules
16
+/public/build
17
+/public/hot
18
+/public/storage
19
+/storage/*.key
20
+/storage/pail
21
+/vendor
22
+Homestead.json
23
+Homestead.yaml
24
+Thumbs.db

+ 8
- 0
app/Http/Controllers/Controller.php 查看文件

@@ -0,0 +1,8 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+abstract class Controller
6
+{
7
+    //
8
+}

+ 48
- 0
app/Models/User.php 查看文件

@@ -0,0 +1,48 @@
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
+
10
+class User extends Authenticatable
11
+{
12
+    /** @use HasFactory<\Database\Factories\UserFactory> */
13
+    use HasFactory, Notifiable;
14
+
15
+    /**
16
+     * The attributes that are mass assignable.
17
+     *
18
+     * @var list<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 list<string>
30
+     */
31
+    protected $hidden = [
32
+        'password',
33
+        'remember_token',
34
+    ];
35
+
36
+    /**
37
+     * Get the attributes that should be cast.
38
+     *
39
+     * @return array<string, string>
40
+     */
41
+    protected function casts(): array
42
+    {
43
+        return [
44
+            'email_verified_at' => 'datetime',
45
+            'password' => 'hashed',
46
+        ];
47
+    }
48
+}

+ 24
- 0
app/Providers/AppServiceProvider.php 查看文件

@@ -0,0 +1,24 @@
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
+    public function register(): void
13
+    {
14
+        //
15
+    }
16
+
17
+    /**
18
+     * Bootstrap any application services.
19
+     */
20
+    public function boot(): void
21
+    {
22
+        //
23
+    }
24
+}

+ 59
- 0
app/Providers/Filament/AdminPanelProvider.php 查看文件

@@ -0,0 +1,59 @@
1
+<?php
2
+
3
+namespace App\Providers\Filament;
4
+
5
+use Filament\Http\Middleware\Authenticate;
6
+use Filament\Http\Middleware\AuthenticateSession;
7
+use Filament\Http\Middleware\DisableBladeIconComponents;
8
+use Filament\Http\Middleware\DispatchServingFilamentEvent;
9
+use Filament\Pages;
10
+use Filament\Pages\Auth\Login;
11
+use Filament\Panel;
12
+use Filament\PanelProvider;
13
+use Filament\Support\Colors\Color;
14
+use Filament\Widgets;
15
+use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
16
+use Illuminate\Cookie\Middleware\EncryptCookies;
17
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
18
+use Illuminate\Routing\Middleware\SubstituteBindings;
19
+use Illuminate\Session\Middleware\StartSession;
20
+use Illuminate\View\Middleware\ShareErrorsFromSession;
21
+
22
+class AdminPanelProvider extends PanelProvider
23
+{
24
+    public function panel(Panel $panel): Panel
25
+    {
26
+        return $panel
27
+            ->default()
28
+            ->id('admin')
29
+            ->path('admin')
30
+            ->login(Login::class)
31
+            ->colors([
32
+                'primary' => Color::Amber,
33
+            ])
34
+            ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
35
+            ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
36
+            ->pages([
37
+                Pages\Dashboard::class,
38
+            ])
39
+            ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
40
+            ->widgets([
41
+                Widgets\AccountWidget::class,
42
+                Widgets\FilamentInfoWidget::class,
43
+            ])
44
+            ->middleware([
45
+                EncryptCookies::class,
46
+                AddQueuedCookiesToResponse::class,
47
+                StartSession::class,
48
+                AuthenticateSession::class,
49
+                ShareErrorsFromSession::class,
50
+                VerifyCsrfToken::class,
51
+                SubstituteBindings::class,
52
+                DisableBladeIconComponents::class,
53
+                DispatchServingFilamentEvent::class,
54
+            ])
55
+            ->authMiddleware([
56
+                Authenticate::class,
57
+            ]);
58
+    }
59
+}

+ 18
- 0
artisan 查看文件

@@ -0,0 +1,18 @@
1
+#!/usr/bin/env php
2
+<?php
3
+
4
+use Illuminate\Foundation\Application;
5
+use Symfony\Component\Console\Input\ArgvInput;
6
+
7
+define('LARAVEL_START', microtime(true));
8
+
9
+// Register the Composer autoloader...
10
+require __DIR__.'/vendor/autoload.php';
11
+
12
+// Bootstrap Laravel and handle the command...
13
+/** @var Application $app */
14
+$app = require_once __DIR__.'/bootstrap/app.php';
15
+
16
+$status = $app->handleCommand(new ArgvInput);
17
+
18
+exit($status);

+ 18
- 0
bootstrap/app.php 查看文件

@@ -0,0 +1,18 @@
1
+<?php
2
+
3
+use Illuminate\Foundation\Application;
4
+use Illuminate\Foundation\Configuration\Exceptions;
5
+use Illuminate\Foundation\Configuration\Middleware;
6
+
7
+return Application::configure(basePath: dirname(__DIR__))
8
+    ->withRouting(
9
+        web: __DIR__.'/../routes/web.php',
10
+        commands: __DIR__.'/../routes/console.php',
11
+        health: '/up',
12
+    )
13
+    ->withMiddleware(function (Middleware $middleware): void {
14
+        //
15
+    })
16
+    ->withExceptions(function (Exceptions $exceptions): void {
17
+        //
18
+    })->create();

+ 2
- 0
bootstrap/cache/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 6
- 0
bootstrap/providers.php 查看文件

@@ -0,0 +1,6 @@
1
+<?php
2
+
3
+return [
4
+    App\Providers\AppServiceProvider::class,
5
+    App\Providers\Filament\AdminPanelProvider::class,
6
+];

+ 77
- 0
composer.json 查看文件

@@ -0,0 +1,77 @@
1
+{
2
+    "$schema": "https://getcomposer.org/schema.json",
3
+    "name": "laravel/laravel",
4
+    "type": "project",
5
+    "description": "The skeleton application for the Laravel framework.",
6
+    "keywords": ["laravel", "framework"],
7
+    "license": "MIT",
8
+    "require": {
9
+        "php": "^8.2",
10
+        "filament/filament": "^3.3",
11
+        "laravel/framework": "^12.0",
12
+        "laravel/tinker": "^2.10.1"
13
+    },
14
+    "require-dev": {
15
+        "fakerphp/faker": "^1.23",
16
+        "laravel/pail": "^1.2.2",
17
+        "laravel/pint": "^1.24",
18
+        "laravel/sail": "^1.41",
19
+        "mockery/mockery": "^1.6",
20
+        "nunomaduro/collision": "^8.6",
21
+        "phpunit/phpunit": "^11.5.3"
22
+    },
23
+    "autoload": {
24
+        "psr-4": {
25
+            "App\\": "app/",
26
+            "Database\\Factories\\": "database/factories/",
27
+            "Database\\Seeders\\": "database/seeders/"
28
+        }
29
+    },
30
+    "autoload-dev": {
31
+        "psr-4": {
32
+            "Tests\\": "tests/"
33
+        }
34
+    },
35
+    "scripts": {
36
+        "post-autoload-dump": [
37
+            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
38
+            "@php artisan package:discover --ansi",
39
+            "@php artisan filament:upgrade"
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
+            "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
50
+            "@php artisan migrate --graceful --ansi"
51
+        ],
52
+        "dev": [
53
+            "Composer\\Config::disableProcessTimeout",
54
+            "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
55
+        ],
56
+        "test": [
57
+            "@php artisan config:clear --ansi",
58
+            "@php artisan test"
59
+        ]
60
+    },
61
+    "extra": {
62
+        "laravel": {
63
+            "dont-discover": []
64
+        }
65
+    },
66
+    "config": {
67
+        "optimize-autoloader": true,
68
+        "preferred-install": "dist",
69
+        "sort-packages": true,
70
+        "allow-plugins": {
71
+            "pestphp/pest-plugin": true,
72
+            "php-http/discovery": true
73
+        }
74
+    },
75
+    "minimum-stability": "stable",
76
+    "prefer-stable": true
77
+}

+ 10069
- 0
composer.lock
文件差异内容过多而无法显示
查看文件


+ 126
- 0
config/app.php 查看文件

@@ -0,0 +1,126 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Application Name
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This value is the name of your application, which will be used when the
11
+    | framework needs to place the application's name in a notification or
12
+    | other UI elements where an application name needs to be displayed.
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
+    | the application so that it's available within Artisan commands.
52
+    |
53
+    */
54
+
55
+    'url' => env('APP_URL', 'http://localhost'),
56
+
57
+    /*
58
+    |--------------------------------------------------------------------------
59
+    | Application Timezone
60
+    |--------------------------------------------------------------------------
61
+    |
62
+    | Here you may specify the default timezone for your application, which
63
+    | will be used by the PHP date and date-time functions. The timezone
64
+    | is set to "UTC" by default as it is suitable for most use cases.
65
+    |
66
+    */
67
+
68
+    'timezone' => 'UTC',
69
+
70
+    /*
71
+    |--------------------------------------------------------------------------
72
+    | Application Locale Configuration
73
+    |--------------------------------------------------------------------------
74
+    |
75
+    | The application locale determines the default locale that will be used
76
+    | by Laravel's translation / localization methods. This option can be
77
+    | set to any locale for which you plan to have translation strings.
78
+    |
79
+    */
80
+
81
+    'locale' => env('APP_LOCALE', 'en'),
82
+
83
+    'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
84
+
85
+    'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
86
+
87
+    /*
88
+    |--------------------------------------------------------------------------
89
+    | Encryption Key
90
+    |--------------------------------------------------------------------------
91
+    |
92
+    | This key is utilized by Laravel's encryption services and should be set
93
+    | to a random, 32 character string to ensure that all encrypted values
94
+    | are secure. You should do this prior to deploying the application.
95
+    |
96
+    */
97
+
98
+    'cipher' => 'AES-256-CBC',
99
+
100
+    'key' => env('APP_KEY'),
101
+
102
+    'previous_keys' => [
103
+        ...array_filter(
104
+            explode(',', (string) env('APP_PREVIOUS_KEYS', ''))
105
+        ),
106
+    ],
107
+
108
+    /*
109
+    |--------------------------------------------------------------------------
110
+    | Maintenance Mode Driver
111
+    |--------------------------------------------------------------------------
112
+    |
113
+    | These configuration options determine the driver used to determine and
114
+    | manage Laravel's "maintenance mode" status. The "cache" driver will
115
+    | allow maintenance mode to be controlled across multiple machines.
116
+    |
117
+    | Supported drivers: "file", "cache"
118
+    |
119
+    */
120
+
121
+    'maintenance' => [
122
+        'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
123
+        'store' => env('APP_MAINTENANCE_STORE', 'database'),
124
+    ],
125
+
126
+];

+ 115
- 0
config/auth.php 查看文件

@@ -0,0 +1,115 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Authentication Defaults
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This option defines the default authentication "guard" and password
11
+    | reset "broker" for your application. You may change these values
12
+    | as required, but they're a perfect start for most applications.
13
+    |
14
+    */
15
+
16
+    'defaults' => [
17
+        'guard' => env('AUTH_GUARD', 'web'),
18
+        'passwords' => env('AUTH_PASSWORD_BROKER', '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
+    | which utilizes session storage plus the Eloquent user provider.
29
+    |
30
+    | All authentication guards have a user provider, which defines how the
31
+    | users are actually retrieved out of your database or other storage
32
+    | system used by the application. Typically, Eloquent is utilized.
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 guards have a user provider, which defines how the
51
+    | users are actually retrieved out of your database or other storage
52
+    | system used by the application. Typically, Eloquent is utilized.
53
+    |
54
+    | If you have multiple user tables or models you may configure multiple
55
+    | providers to represent the model / table. These providers 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' => env('AUTH_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
+    | These configuration options specify the behavior of Laravel's password
80
+    | reset functionality, including the table utilized for token storage
81
+    | and the user provider that is invoked to actually retrieve users.
82
+    |
83
+    | The expiry 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
+    | The throttle setting is the number of seconds a user must wait before
88
+    | generating more password reset tokens. This prevents the user from
89
+    | quickly generating a very large amount of password reset tokens.
90
+    |
91
+    */
92
+
93
+    'passwords' => [
94
+        'users' => [
95
+            'provider' => 'users',
96
+            'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
97
+            'expire' => 60,
98
+            'throttle' => 60,
99
+        ],
100
+    ],
101
+
102
+    /*
103
+    |--------------------------------------------------------------------------
104
+    | Password Confirmation Timeout
105
+    |--------------------------------------------------------------------------
106
+    |
107
+    | Here you may define the number of seconds before a password confirmation
108
+    | window expires and users are asked to re-enter their password via the
109
+    | confirmation screen. By default, the timeout lasts for three hours.
110
+    |
111
+    */
112
+
113
+    'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
114
+
115
+];

+ 108
- 0
config/cache.php 查看文件

@@ -0,0 +1,108 @@
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 store that will be used by the
13
+    | framework. This connection is utilized if another isn't explicitly
14
+    | specified when running a cache operation inside the application.
15
+    |
16
+    */
17
+
18
+    'default' => env('CACHE_STORE', 'database'),
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: "array", "database", "file", "memcached",
30
+    |                    "redis", "dynamodb", "octane", "null"
31
+    |
32
+    */
33
+
34
+    'stores' => [
35
+
36
+        'array' => [
37
+            'driver' => 'array',
38
+            'serialize' => false,
39
+        ],
40
+
41
+        'database' => [
42
+            'driver' => 'database',
43
+            'connection' => env('DB_CACHE_CONNECTION'),
44
+            'table' => env('DB_CACHE_TABLE', 'cache'),
45
+            'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
46
+            'lock_table' => env('DB_CACHE_LOCK_TABLE'),
47
+        ],
48
+
49
+        'file' => [
50
+            'driver' => 'file',
51
+            'path' => storage_path('framework/cache/data'),
52
+            'lock_path' => storage_path('framework/cache/data'),
53
+        ],
54
+
55
+        'memcached' => [
56
+            'driver' => 'memcached',
57
+            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
58
+            'sasl' => [
59
+                env('MEMCACHED_USERNAME'),
60
+                env('MEMCACHED_PASSWORD'),
61
+            ],
62
+            'options' => [
63
+                // Memcached::OPT_CONNECT_TIMEOUT => 2000,
64
+            ],
65
+            'servers' => [
66
+                [
67
+                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
68
+                    'port' => env('MEMCACHED_PORT', 11211),
69
+                    'weight' => 100,
70
+                ],
71
+            ],
72
+        ],
73
+
74
+        'redis' => [
75
+            'driver' => 'redis',
76
+            'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
77
+            'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
78
+        ],
79
+
80
+        'dynamodb' => [
81
+            'driver' => 'dynamodb',
82
+            'key' => env('AWS_ACCESS_KEY_ID'),
83
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
84
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
85
+            'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
86
+            'endpoint' => env('DYNAMODB_ENDPOINT'),
87
+        ],
88
+
89
+        'octane' => [
90
+            'driver' => 'octane',
91
+        ],
92
+
93
+    ],
94
+
95
+    /*
96
+    |--------------------------------------------------------------------------
97
+    | Cache Key Prefix
98
+    |--------------------------------------------------------------------------
99
+    |
100
+    | When utilizing the APC, database, memcached, Redis, and DynamoDB cache
101
+    | stores, there might be other applications using the same cache. For
102
+    | that reason, you may prefix every cache key to avoid collisions.
103
+    |
104
+    */
105
+
106
+    'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'),
107
+
108
+];

+ 183
- 0
config/database.php 查看文件

@@ -0,0 +1,183 @@
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 database operations. This is
14
+    | the connection which will be utilized unless another connection
15
+    | is explicitly specified when you execute a query / statement.
16
+    |
17
+    */
18
+
19
+    'default' => env('DB_CONNECTION', 'sqlite'),
20
+
21
+    /*
22
+    |--------------------------------------------------------------------------
23
+    | Database Connections
24
+    |--------------------------------------------------------------------------
25
+    |
26
+    | Below are all of the database connections defined for your application.
27
+    | An example configuration is provided for each database system which
28
+    | is supported by Laravel. You're free to add / remove connections.
29
+    |
30
+    */
31
+
32
+    'connections' => [
33
+
34
+        'sqlite' => [
35
+            'driver' => 'sqlite',
36
+            'url' => env('DB_URL'),
37
+            'database' => env('DB_DATABASE', database_path('database.sqlite')),
38
+            'prefix' => '',
39
+            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
40
+            'busy_timeout' => null,
41
+            'journal_mode' => null,
42
+            'synchronous' => null,
43
+            'transaction_mode' => 'DEFERRED',
44
+        ],
45
+
46
+        'mysql' => [
47
+            'driver' => 'mysql',
48
+            'url' => env('DB_URL'),
49
+            'host' => env('DB_HOST', '127.0.0.1'),
50
+            'port' => env('DB_PORT', '3306'),
51
+            'database' => env('DB_DATABASE', 'laravel'),
52
+            'username' => env('DB_USERNAME', 'root'),
53
+            'password' => env('DB_PASSWORD', ''),
54
+            'unix_socket' => env('DB_SOCKET', ''),
55
+            'charset' => env('DB_CHARSET', 'utf8mb4'),
56
+            'collation' => env('DB_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
+        'mariadb' => [
67
+            'driver' => 'mariadb',
68
+            'url' => env('DB_URL'),
69
+            'host' => env('DB_HOST', '127.0.0.1'),
70
+            'port' => env('DB_PORT', '3306'),
71
+            'database' => env('DB_DATABASE', 'laravel'),
72
+            'username' => env('DB_USERNAME', 'root'),
73
+            'password' => env('DB_PASSWORD', ''),
74
+            'unix_socket' => env('DB_SOCKET', ''),
75
+            'charset' => env('DB_CHARSET', 'utf8mb4'),
76
+            'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
77
+            'prefix' => '',
78
+            'prefix_indexes' => true,
79
+            'strict' => true,
80
+            'engine' => null,
81
+            'options' => extension_loaded('pdo_mysql') ? array_filter([
82
+                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
83
+            ]) : [],
84
+        ],
85
+
86
+        'pgsql' => [
87
+            'driver' => 'pgsql',
88
+            'url' => env('DB_URL'),
89
+            'host' => env('DB_HOST', '127.0.0.1'),
90
+            'port' => env('DB_PORT', '5432'),
91
+            'database' => env('DB_DATABASE', 'laravel'),
92
+            'username' => env('DB_USERNAME', 'root'),
93
+            'password' => env('DB_PASSWORD', ''),
94
+            'charset' => env('DB_CHARSET', 'utf8'),
95
+            'prefix' => '',
96
+            'prefix_indexes' => true,
97
+            'search_path' => 'public',
98
+            'sslmode' => 'prefer',
99
+        ],
100
+
101
+        'sqlsrv' => [
102
+            'driver' => 'sqlsrv',
103
+            'url' => env('DB_URL'),
104
+            'host' => env('DB_HOST', 'localhost'),
105
+            'port' => env('DB_PORT', '1433'),
106
+            'database' => env('DB_DATABASE', 'laravel'),
107
+            'username' => env('DB_USERNAME', 'root'),
108
+            'password' => env('DB_PASSWORD', ''),
109
+            'charset' => env('DB_CHARSET', 'utf8'),
110
+            'prefix' => '',
111
+            'prefix_indexes' => true,
112
+            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
113
+            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
114
+        ],
115
+
116
+    ],
117
+
118
+    /*
119
+    |--------------------------------------------------------------------------
120
+    | Migration Repository Table
121
+    |--------------------------------------------------------------------------
122
+    |
123
+    | This table keeps track of all the migrations that have already run for
124
+    | your application. Using this information, we can determine which of
125
+    | the migrations on disk haven't actually been run on the database.
126
+    |
127
+    */
128
+
129
+    'migrations' => [
130
+        'table' => 'migrations',
131
+        'update_date_on_publish' => true,
132
+    ],
133
+
134
+    /*
135
+    |--------------------------------------------------------------------------
136
+    | Redis Databases
137
+    |--------------------------------------------------------------------------
138
+    |
139
+    | Redis is an open source, fast, and advanced key-value store that also
140
+    | provides a richer body of commands than a typical key-value system
141
+    | such as Memcached. You may define your connection settings here.
142
+    |
143
+    */
144
+
145
+    'redis' => [
146
+
147
+        'client' => env('REDIS_CLIENT', 'phpredis'),
148
+
149
+        'options' => [
150
+            'cluster' => env('REDIS_CLUSTER', 'redis'),
151
+            'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
152
+            'persistent' => env('REDIS_PERSISTENT', false),
153
+        ],
154
+
155
+        'default' => [
156
+            'url' => env('REDIS_URL'),
157
+            'host' => env('REDIS_HOST', '127.0.0.1'),
158
+            'username' => env('REDIS_USERNAME'),
159
+            'password' => env('REDIS_PASSWORD'),
160
+            'port' => env('REDIS_PORT', '6379'),
161
+            'database' => env('REDIS_DB', '0'),
162
+            'max_retries' => env('REDIS_MAX_RETRIES', 3),
163
+            'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
164
+            'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
165
+            'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
166
+        ],
167
+
168
+        'cache' => [
169
+            'url' => env('REDIS_URL'),
170
+            'host' => env('REDIS_HOST', '127.0.0.1'),
171
+            'username' => env('REDIS_USERNAME'),
172
+            'password' => env('REDIS_PASSWORD'),
173
+            'port' => env('REDIS_PORT', '6379'),
174
+            'database' => env('REDIS_CACHE_DB', '1'),
175
+            'max_retries' => env('REDIS_MAX_RETRIES', 3),
176
+            'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
177
+            'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
178
+            'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
179
+        ],
180
+
181
+    ],
182
+
183
+];

+ 80
- 0
config/filesystems.php 查看文件

@@ -0,0 +1,80 @@
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 for file storage.
13
+    |
14
+    */
15
+
16
+    'default' => env('FILESYSTEM_DISK', 'local'),
17
+
18
+    /*
19
+    |--------------------------------------------------------------------------
20
+    | Filesystem Disks
21
+    |--------------------------------------------------------------------------
22
+    |
23
+    | Below you may configure as many filesystem disks as necessary, and you
24
+    | may even configure multiple disks for the same driver. Examples for
25
+    | most supported storage drivers are configured here for reference.
26
+    |
27
+    | Supported drivers: "local", "ftp", "sftp", "s3"
28
+    |
29
+    */
30
+
31
+    'disks' => [
32
+
33
+        'local' => [
34
+            'driver' => 'local',
35
+            'root' => storage_path('app/private'),
36
+            'serve' => true,
37
+            'throw' => false,
38
+            'report' => false,
39
+        ],
40
+
41
+        'public' => [
42
+            'driver' => 'local',
43
+            'root' => storage_path('app/public'),
44
+            'url' => env('APP_URL').'/storage',
45
+            'visibility' => 'public',
46
+            'throw' => false,
47
+            'report' => false,
48
+        ],
49
+
50
+        's3' => [
51
+            'driver' => 's3',
52
+            'key' => env('AWS_ACCESS_KEY_ID'),
53
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
54
+            'region' => env('AWS_DEFAULT_REGION'),
55
+            'bucket' => env('AWS_BUCKET'),
56
+            'url' => env('AWS_URL'),
57
+            'endpoint' => env('AWS_ENDPOINT'),
58
+            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
59
+            'throw' => false,
60
+            'report' => false,
61
+        ],
62
+
63
+    ],
64
+
65
+    /*
66
+    |--------------------------------------------------------------------------
67
+    | Symbolic Links
68
+    |--------------------------------------------------------------------------
69
+    |
70
+    | Here you may configure the symbolic links that will be created when the
71
+    | `storage:link` Artisan command is executed. The array keys should be
72
+    | the locations of the links and the values should be their targets.
73
+    |
74
+    */
75
+
76
+    'links' => [
77
+        public_path('storage') => storage_path('app/public'),
78
+    ],
79
+
80
+];

+ 132
- 0
config/logging.php 查看文件

@@ -0,0 +1,132 @@
1
+<?php
2
+
3
+use Monolog\Handler\NullHandler;
4
+use Monolog\Handler\StreamHandler;
5
+use Monolog\Handler\SyslogUdpHandler;
6
+use Monolog\Processor\PsrLogMessageProcessor;
7
+
8
+return [
9
+
10
+    /*
11
+    |--------------------------------------------------------------------------
12
+    | Default Log Channel
13
+    |--------------------------------------------------------------------------
14
+    |
15
+    | This option defines the default log channel that is utilized to write
16
+    | messages to your logs. The value provided here should match one of
17
+    | the channels present in the list of "channels" configured below.
18
+    |
19
+    */
20
+
21
+    'default' => env('LOG_CHANNEL', 'stack'),
22
+
23
+    /*
24
+    |--------------------------------------------------------------------------
25
+    | Deprecations Log Channel
26
+    |--------------------------------------------------------------------------
27
+    |
28
+    | This option controls the log channel that should be used to log warnings
29
+    | regarding deprecated PHP and library features. This allows you to get
30
+    | your application ready for upcoming major versions of dependencies.
31
+    |
32
+    */
33
+
34
+    'deprecations' => [
35
+        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
36
+        'trace' => env('LOG_DEPRECATIONS_TRACE', false),
37
+    ],
38
+
39
+    /*
40
+    |--------------------------------------------------------------------------
41
+    | Log Channels
42
+    |--------------------------------------------------------------------------
43
+    |
44
+    | Here you may configure the log channels for your application. Laravel
45
+    | utilizes the Monolog PHP logging library, which includes a variety
46
+    | of powerful log handlers and formatters that you're free to use.
47
+    |
48
+    | Available drivers: "single", "daily", "slack", "syslog",
49
+    |                    "errorlog", "monolog", "custom", "stack"
50
+    |
51
+    */
52
+
53
+    'channels' => [
54
+
55
+        'stack' => [
56
+            'driver' => 'stack',
57
+            'channels' => explode(',', (string) env('LOG_STACK', 'single')),
58
+            'ignore_exceptions' => false,
59
+        ],
60
+
61
+        'single' => [
62
+            'driver' => 'single',
63
+            'path' => storage_path('logs/laravel.log'),
64
+            'level' => env('LOG_LEVEL', 'debug'),
65
+            'replace_placeholders' => true,
66
+        ],
67
+
68
+        'daily' => [
69
+            'driver' => 'daily',
70
+            'path' => storage_path('logs/laravel.log'),
71
+            'level' => env('LOG_LEVEL', 'debug'),
72
+            'days' => env('LOG_DAILY_DAYS', 14),
73
+            'replace_placeholders' => true,
74
+        ],
75
+
76
+        'slack' => [
77
+            'driver' => 'slack',
78
+            'url' => env('LOG_SLACK_WEBHOOK_URL'),
79
+            'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'),
80
+            'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
81
+            'level' => env('LOG_LEVEL', 'critical'),
82
+            'replace_placeholders' => true,
83
+        ],
84
+
85
+        'papertrail' => [
86
+            'driver' => 'monolog',
87
+            'level' => env('LOG_LEVEL', 'debug'),
88
+            'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
89
+            'handler_with' => [
90
+                'host' => env('PAPERTRAIL_URL'),
91
+                'port' => env('PAPERTRAIL_PORT'),
92
+                'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
93
+            ],
94
+            'processors' => [PsrLogMessageProcessor::class],
95
+        ],
96
+
97
+        'stderr' => [
98
+            'driver' => 'monolog',
99
+            'level' => env('LOG_LEVEL', 'debug'),
100
+            'handler' => StreamHandler::class,
101
+            'handler_with' => [
102
+                'stream' => 'php://stderr',
103
+            ],
104
+            'formatter' => env('LOG_STDERR_FORMATTER'),
105
+            'processors' => [PsrLogMessageProcessor::class],
106
+        ],
107
+
108
+        'syslog' => [
109
+            'driver' => 'syslog',
110
+            'level' => env('LOG_LEVEL', 'debug'),
111
+            'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
112
+            'replace_placeholders' => true,
113
+        ],
114
+
115
+        'errorlog' => [
116
+            'driver' => 'errorlog',
117
+            'level' => env('LOG_LEVEL', 'debug'),
118
+            'replace_placeholders' => true,
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
+
132
+];

+ 118
- 0
config/mail.php 查看文件

@@ -0,0 +1,118 @@
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 all email
11
+    | messages unless another mailer is explicitly specified when sending
12
+    | the message. All additional mailers can be configured within the
13
+    | "mailers" array. Examples of each type of mailer are provided.
14
+    |
15
+    */
16
+
17
+    'default' => env('MAIL_MAILER', 'log'),
18
+
19
+    /*
20
+    |--------------------------------------------------------------------------
21
+    | Mailer Configurations
22
+    |--------------------------------------------------------------------------
23
+    |
24
+    | Here you may configure all of the mailers used by your application plus
25
+    | their respective settings. Several examples have been configured for
26
+    | you and you are free to add your own as your application requires.
27
+    |
28
+    | Laravel supports a variety of mail "transport" drivers that can be used
29
+    | when delivering an email. You may specify which one you're using for
30
+    | your mailers below. You may also add additional mailers if needed.
31
+    |
32
+    | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
33
+    |            "postmark", "resend", "log", "array",
34
+    |            "failover", "roundrobin"
35
+    |
36
+    */
37
+
38
+    'mailers' => [
39
+
40
+        'smtp' => [
41
+            'transport' => 'smtp',
42
+            'scheme' => env('MAIL_SCHEME'),
43
+            'url' => env('MAIL_URL'),
44
+            'host' => env('MAIL_HOST', '127.0.0.1'),
45
+            'port' => env('MAIL_PORT', 2525),
46
+            'username' => env('MAIL_USERNAME'),
47
+            'password' => env('MAIL_PASSWORD'),
48
+            'timeout' => null,
49
+            'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
50
+        ],
51
+
52
+        'ses' => [
53
+            'transport' => 'ses',
54
+        ],
55
+
56
+        'postmark' => [
57
+            'transport' => 'postmark',
58
+            // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
59
+            // 'client' => [
60
+            //     'timeout' => 5,
61
+            // ],
62
+        ],
63
+
64
+        'resend' => [
65
+            'transport' => 'resend',
66
+        ],
67
+
68
+        'sendmail' => [
69
+            'transport' => 'sendmail',
70
+            'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
71
+        ],
72
+
73
+        'log' => [
74
+            'transport' => 'log',
75
+            'channel' => env('MAIL_LOG_CHANNEL'),
76
+        ],
77
+
78
+        'array' => [
79
+            'transport' => 'array',
80
+        ],
81
+
82
+        'failover' => [
83
+            'transport' => 'failover',
84
+            'mailers' => [
85
+                'smtp',
86
+                'log',
87
+            ],
88
+            'retry_after' => 60,
89
+        ],
90
+
91
+        'roundrobin' => [
92
+            'transport' => 'roundrobin',
93
+            'mailers' => [
94
+                'ses',
95
+                'postmark',
96
+            ],
97
+            'retry_after' => 60,
98
+        ],
99
+
100
+    ],
101
+
102
+    /*
103
+    |--------------------------------------------------------------------------
104
+    | Global "From" Address
105
+    |--------------------------------------------------------------------------
106
+    |
107
+    | You may wish for all emails sent by your application to be sent from
108
+    | the same address. Here you may specify a name and address that is
109
+    | used globally for all emails that are sent by your application.
110
+    |
111
+    */
112
+
113
+    'from' => [
114
+        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
115
+        'name' => env('MAIL_FROM_NAME', 'Example'),
116
+    ],
117
+
118
+];

+ 112
- 0
config/queue.php 查看文件

@@ -0,0 +1,112 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Queue Connection Name
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | Laravel's queue supports a variety of backends via a single, unified
11
+    | API, giving you convenient access to each backend using identical
12
+    | syntax for each. The default queue connection is defined below.
13
+    |
14
+    */
15
+
16
+    'default' => env('QUEUE_CONNECTION', 'database'),
17
+
18
+    /*
19
+    |--------------------------------------------------------------------------
20
+    | Queue Connections
21
+    |--------------------------------------------------------------------------
22
+    |
23
+    | Here you may configure the connection options for every queue backend
24
+    | used by your application. An example configuration is provided for
25
+    | each backend supported by Laravel. You're also 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
+            'connection' => env('DB_QUEUE_CONNECTION'),
40
+            'table' => env('DB_QUEUE_TABLE', 'jobs'),
41
+            'queue' => env('DB_QUEUE', 'default'),
42
+            'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
43
+            'after_commit' => false,
44
+        ],
45
+
46
+        'beanstalkd' => [
47
+            'driver' => 'beanstalkd',
48
+            'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
49
+            'queue' => env('BEANSTALKD_QUEUE', 'default'),
50
+            'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
51
+            'block_for' => 0,
52
+            'after_commit' => false,
53
+        ],
54
+
55
+        'sqs' => [
56
+            'driver' => 'sqs',
57
+            'key' => env('AWS_ACCESS_KEY_ID'),
58
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
59
+            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
60
+            'queue' => env('SQS_QUEUE', 'default'),
61
+            'suffix' => env('SQS_SUFFIX'),
62
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
63
+            'after_commit' => false,
64
+        ],
65
+
66
+        'redis' => [
67
+            'driver' => 'redis',
68
+            'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
69
+            'queue' => env('REDIS_QUEUE', 'default'),
70
+            'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
71
+            'block_for' => null,
72
+            'after_commit' => false,
73
+        ],
74
+
75
+    ],
76
+
77
+    /*
78
+    |--------------------------------------------------------------------------
79
+    | Job Batching
80
+    |--------------------------------------------------------------------------
81
+    |
82
+    | The following options configure the database and table that store job
83
+    | batching information. These options can be updated to any database
84
+    | connection and table which has been defined by your application.
85
+    |
86
+    */
87
+
88
+    'batching' => [
89
+        'database' => env('DB_CONNECTION', 'sqlite'),
90
+        'table' => 'job_batches',
91
+    ],
92
+
93
+    /*
94
+    |--------------------------------------------------------------------------
95
+    | Failed Queue Jobs
96
+    |--------------------------------------------------------------------------
97
+    |
98
+    | These options configure the behavior of failed queue job logging so you
99
+    | can control how and where failed jobs are stored. Laravel ships with
100
+    | support for storing failed jobs in a simple file or in a database.
101
+    |
102
+    | Supported drivers: "database-uuids", "dynamodb", "file", "null"
103
+    |
104
+    */
105
+
106
+    'failed' => [
107
+        'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
108
+        'database' => env('DB_CONNECTION', 'sqlite'),
109
+        'table' => 'failed_jobs',
110
+    ],
111
+
112
+];

+ 38
- 0
config/services.php 查看文件

@@ -0,0 +1,38 @@
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
+    'postmark' => [
18
+        'token' => env('POSTMARK_TOKEN'),
19
+    ],
20
+
21
+    'resend' => [
22
+        'key' => env('RESEND_KEY'),
23
+    ],
24
+
25
+    'ses' => [
26
+        'key' => env('AWS_ACCESS_KEY_ID'),
27
+        'secret' => env('AWS_SECRET_ACCESS_KEY'),
28
+        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
29
+    ],
30
+
31
+    'slack' => [
32
+        'notifications' => [
33
+            'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
34
+            'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
35
+        ],
36
+    ],
37
+
38
+];

+ 217
- 0
config/session.php 查看文件

@@ -0,0 +1,217 @@
1
+<?php
2
+
3
+use Illuminate\Support\Str;
4
+
5
+return [
6
+
7
+    /*
8
+    |--------------------------------------------------------------------------
9
+    | Default Session Driver
10
+    |--------------------------------------------------------------------------
11
+    |
12
+    | This option determines the default session driver that is utilized for
13
+    | incoming requests. Laravel supports a variety of storage options to
14
+    | persist session data. Database storage is a great default choice.
15
+    |
16
+    | Supported: "file", "cookie", "database", "memcached",
17
+    |            "redis", "dynamodb", "array"
18
+    |
19
+    */
20
+
21
+    'driver' => env('SESSION_DRIVER', 'database'),
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 expire immediately when the browser is closed then you may
31
+    | indicate that via the expire_on_close configuration option.
32
+    |
33
+    */
34
+
35
+    'lifetime' => (int) env('SESSION_LIFETIME', 120),
36
+
37
+    'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
38
+
39
+    /*
40
+    |--------------------------------------------------------------------------
41
+    | Session Encryption
42
+    |--------------------------------------------------------------------------
43
+    |
44
+    | This option allows you to easily specify that all of your session data
45
+    | should be encrypted before it's stored. All encryption is performed
46
+    | automatically by Laravel and you may use the session like normal.
47
+    |
48
+    */
49
+
50
+    'encrypt' => env('SESSION_ENCRYPT', false),
51
+
52
+    /*
53
+    |--------------------------------------------------------------------------
54
+    | Session File Location
55
+    |--------------------------------------------------------------------------
56
+    |
57
+    | When utilizing the "file" session driver, the session files are placed
58
+    | on disk. The default storage location is defined here; however, you
59
+    | are free to provide another location where they should be stored.
60
+    |
61
+    */
62
+
63
+    'files' => storage_path('framework/sessions'),
64
+
65
+    /*
66
+    |--------------------------------------------------------------------------
67
+    | Session Database Connection
68
+    |--------------------------------------------------------------------------
69
+    |
70
+    | When using the "database" or "redis" session drivers, you may specify a
71
+    | connection that should be used to manage these sessions. This should
72
+    | correspond to a connection in your database configuration options.
73
+    |
74
+    */
75
+
76
+    'connection' => env('SESSION_CONNECTION'),
77
+
78
+    /*
79
+    |--------------------------------------------------------------------------
80
+    | Session Database Table
81
+    |--------------------------------------------------------------------------
82
+    |
83
+    | When using the "database" session driver, you may specify the table to
84
+    | be used to store sessions. Of course, a sensible default is defined
85
+    | for you; however, you're welcome to change this to another table.
86
+    |
87
+    */
88
+
89
+    'table' => env('SESSION_TABLE', 'sessions'),
90
+
91
+    /*
92
+    |--------------------------------------------------------------------------
93
+    | Session Cache Store
94
+    |--------------------------------------------------------------------------
95
+    |
96
+    | When using one of the framework's cache driven session backends, you may
97
+    | define the cache store which should be used to store the session data
98
+    | between requests. This must match one of your defined cache stores.
99
+    |
100
+    | Affects: "dynamodb", "memcached", "redis"
101
+    |
102
+    */
103
+
104
+    'store' => env('SESSION_STORE'),
105
+
106
+    /*
107
+    |--------------------------------------------------------------------------
108
+    | Session Sweeping Lottery
109
+    |--------------------------------------------------------------------------
110
+    |
111
+    | Some session drivers must manually sweep their storage location to get
112
+    | rid of old sessions from storage. Here are the chances that it will
113
+    | happen on a given request. By default, the odds are 2 out of 100.
114
+    |
115
+    */
116
+
117
+    'lottery' => [2, 100],
118
+
119
+    /*
120
+    |--------------------------------------------------------------------------
121
+    | Session Cookie Name
122
+    |--------------------------------------------------------------------------
123
+    |
124
+    | Here you may change the name of the session cookie that is created by
125
+    | the framework. Typically, you should not need to change this value
126
+    | since doing so does not grant a meaningful security improvement.
127
+    |
128
+    */
129
+
130
+    'cookie' => env(
131
+        'SESSION_COOKIE',
132
+        Str::slug(env('APP_NAME', 'laravel')).'-session'
133
+    ),
134
+
135
+    /*
136
+    |--------------------------------------------------------------------------
137
+    | Session Cookie Path
138
+    |--------------------------------------------------------------------------
139
+    |
140
+    | The session cookie path determines the path for which the cookie will
141
+    | be regarded as available. Typically, this will be the root path of
142
+    | your application, but you're free to change this when necessary.
143
+    |
144
+    */
145
+
146
+    'path' => env('SESSION_PATH', '/'),
147
+
148
+    /*
149
+    |--------------------------------------------------------------------------
150
+    | Session Cookie Domain
151
+    |--------------------------------------------------------------------------
152
+    |
153
+    | This value determines the domain and subdomains the session cookie is
154
+    | available to. By default, the cookie will be available to the root
155
+    | domain and all subdomains. Typically, this shouldn't be changed.
156
+    |
157
+    */
158
+
159
+    'domain' => env('SESSION_DOMAIN'),
160
+
161
+    /*
162
+    |--------------------------------------------------------------------------
163
+    | HTTPS Only Cookies
164
+    |--------------------------------------------------------------------------
165
+    |
166
+    | By setting this option to true, session cookies will only be sent back
167
+    | to the server if the browser has a HTTPS connection. This will keep
168
+    | the cookie from being sent to you when it can't be done securely.
169
+    |
170
+    */
171
+
172
+    'secure' => env('SESSION_SECURE_COOKIE'),
173
+
174
+    /*
175
+    |--------------------------------------------------------------------------
176
+    | HTTP Access Only
177
+    |--------------------------------------------------------------------------
178
+    |
179
+    | Setting this value to true will prevent JavaScript from accessing the
180
+    | value of the cookie and the cookie will only be accessible through
181
+    | the HTTP protocol. It's unlikely you should disable this option.
182
+    |
183
+    */
184
+
185
+    'http_only' => env('SESSION_HTTP_ONLY', true),
186
+
187
+    /*
188
+    |--------------------------------------------------------------------------
189
+    | Same-Site Cookies
190
+    |--------------------------------------------------------------------------
191
+    |
192
+    | This option determines how your cookies behave when cross-site requests
193
+    | take place, and can be used to mitigate CSRF attacks. By default, we
194
+    | will set this value to "lax" to permit secure cross-site requests.
195
+    |
196
+    | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
197
+    |
198
+    | Supported: "lax", "strict", "none", null
199
+    |
200
+    */
201
+
202
+    'same_site' => env('SESSION_SAME_SITE', 'lax'),
203
+
204
+    /*
205
+    |--------------------------------------------------------------------------
206
+    | Partitioned Cookies
207
+    |--------------------------------------------------------------------------
208
+    |
209
+    | Setting this value to true will tie the cookie to the top-level site for
210
+    | a cross-site context. Partitioned cookies are accepted by the browser
211
+    | when flagged "secure" and the Same-Site attribute is set to "none".
212
+    |
213
+    */
214
+
215
+    'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
216
+
217
+];

+ 1
- 0
database/.gitignore 查看文件

@@ -0,0 +1 @@
1
+*.sqlite*

+ 44
- 0
database/factories/UserFactory.php 查看文件

@@ -0,0 +1,44 @@
1
+<?php
2
+
3
+namespace Database\Factories;
4
+
5
+use Illuminate\Database\Eloquent\Factories\Factory;
6
+use Illuminate\Support\Facades\Hash;
7
+use Illuminate\Support\Str;
8
+
9
+/**
10
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
11
+ */
12
+class UserFactory extends Factory
13
+{
14
+    /**
15
+     * The current password being used by the factory.
16
+     */
17
+    protected static ?string $password;
18
+
19
+    /**
20
+     * Define the model's default state.
21
+     *
22
+     * @return array<string, mixed>
23
+     */
24
+    public function definition(): array
25
+    {
26
+        return [
27
+            'name' => fake()->name(),
28
+            'email' => fake()->unique()->safeEmail(),
29
+            'email_verified_at' => now(),
30
+            'password' => static::$password ??= Hash::make('password'),
31
+            'remember_token' => Str::random(10),
32
+        ];
33
+    }
34
+
35
+    /**
36
+     * Indicate that the model's email address should be unverified.
37
+     */
38
+    public function unverified(): static
39
+    {
40
+        return $this->state(fn (array $attributes) => [
41
+            'email_verified_at' => null,
42
+        ]);
43
+    }
44
+}

+ 49
- 0
database/migrations/0001_01_01_000000_create_users_table.php 查看文件

@@ -0,0 +1,49 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('users', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->string('name');
17
+            $table->string('email')->unique();
18
+            $table->timestamp('email_verified_at')->nullable();
19
+            $table->string('password');
20
+            $table->rememberToken();
21
+            $table->timestamps();
22
+        });
23
+
24
+        Schema::create('password_reset_tokens', function (Blueprint $table) {
25
+            $table->string('email')->primary();
26
+            $table->string('token');
27
+            $table->timestamp('created_at')->nullable();
28
+        });
29
+
30
+        Schema::create('sessions', function (Blueprint $table) {
31
+            $table->string('id')->primary();
32
+            $table->foreignId('user_id')->nullable()->index();
33
+            $table->string('ip_address', 45)->nullable();
34
+            $table->text('user_agent')->nullable();
35
+            $table->longText('payload');
36
+            $table->integer('last_activity')->index();
37
+        });
38
+    }
39
+
40
+    /**
41
+     * Reverse the migrations.
42
+     */
43
+    public function down(): void
44
+    {
45
+        Schema::dropIfExists('users');
46
+        Schema::dropIfExists('password_reset_tokens');
47
+        Schema::dropIfExists('sessions');
48
+    }
49
+};

+ 35
- 0
database/migrations/0001_01_01_000001_create_cache_table.php 查看文件

@@ -0,0 +1,35 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('cache', function (Blueprint $table) {
15
+            $table->string('key')->primary();
16
+            $table->mediumText('value');
17
+            $table->integer('expiration');
18
+        });
19
+
20
+        Schema::create('cache_locks', function (Blueprint $table) {
21
+            $table->string('key')->primary();
22
+            $table->string('owner');
23
+            $table->integer('expiration');
24
+        });
25
+    }
26
+
27
+    /**
28
+     * Reverse the migrations.
29
+     */
30
+    public function down(): void
31
+    {
32
+        Schema::dropIfExists('cache');
33
+        Schema::dropIfExists('cache_locks');
34
+    }
35
+};

+ 57
- 0
database/migrations/0001_01_01_000002_create_jobs_table.php 查看文件

@@ -0,0 +1,57 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('jobs', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->string('queue')->index();
17
+            $table->longText('payload');
18
+            $table->unsignedTinyInteger('attempts');
19
+            $table->unsignedInteger('reserved_at')->nullable();
20
+            $table->unsignedInteger('available_at');
21
+            $table->unsignedInteger('created_at');
22
+        });
23
+
24
+        Schema::create('job_batches', function (Blueprint $table) {
25
+            $table->string('id')->primary();
26
+            $table->string('name');
27
+            $table->integer('total_jobs');
28
+            $table->integer('pending_jobs');
29
+            $table->integer('failed_jobs');
30
+            $table->longText('failed_job_ids');
31
+            $table->mediumText('options')->nullable();
32
+            $table->integer('cancelled_at')->nullable();
33
+            $table->integer('created_at');
34
+            $table->integer('finished_at')->nullable();
35
+        });
36
+
37
+        Schema::create('failed_jobs', function (Blueprint $table) {
38
+            $table->id();
39
+            $table->string('uuid')->unique();
40
+            $table->text('connection');
41
+            $table->text('queue');
42
+            $table->longText('payload');
43
+            $table->longText('exception');
44
+            $table->timestamp('failed_at')->useCurrent();
45
+        });
46
+    }
47
+
48
+    /**
49
+     * Reverse the migrations.
50
+     */
51
+    public function down(): void
52
+    {
53
+        Schema::dropIfExists('jobs');
54
+        Schema::dropIfExists('job_batches');
55
+        Schema::dropIfExists('failed_jobs');
56
+    }
57
+};

+ 23
- 0
database/seeders/DatabaseSeeder.php 查看文件

@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+namespace Database\Seeders;
4
+
5
+use App\Models\User;
6
+// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
7
+use Illuminate\Database\Seeder;
8
+
9
+class DatabaseSeeder extends Seeder
10
+{
11
+    /**
12
+     * Seed the application's database.
13
+     */
14
+    public function run(): void
15
+    {
16
+        // User::factory(10)->create();
17
+
18
+        User::factory()->create([
19
+            'name' => 'Test User',
20
+            'email' => 'test@example.com',
21
+        ]);
22
+    }
23
+}

+ 17
- 0
package.json 查看文件

@@ -0,0 +1,17 @@
1
+{
2
+    "$schema": "https://json.schemastore.org/package.json",
3
+    "private": true,
4
+    "type": "module",
5
+    "scripts": {
6
+        "build": "vite build",
7
+        "dev": "vite"
8
+    },
9
+    "devDependencies": {
10
+        "@tailwindcss/vite": "^4.0.0",
11
+        "axios": "^1.11.0",
12
+        "concurrently": "^9.0.1",
13
+        "laravel-vite-plugin": "^2.0.0",
14
+        "tailwindcss": "^4.0.0",
15
+        "vite": "^7.0.4"
16
+    }
17
+}

+ 34
- 0
phpunit.xml 查看文件

@@ -0,0 +1,34 @@
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>tests/Unit</directory>
10
+        </testsuite>
11
+        <testsuite name="Feature">
12
+            <directory>tests/Feature</directory>
13
+        </testsuite>
14
+    </testsuites>
15
+    <source>
16
+        <include>
17
+            <directory>app</directory>
18
+        </include>
19
+    </source>
20
+    <php>
21
+        <env name="APP_ENV" value="testing"/>
22
+        <env name="APP_MAINTENANCE_DRIVER" value="file"/>
23
+        <env name="BCRYPT_ROUNDS" value="4"/>
24
+        <env name="CACHE_STORE" value="array"/>
25
+        <env name="DB_CONNECTION" value="sqlite"/>
26
+        <env name="DB_DATABASE" value=":memory:"/>
27
+        <env name="MAIL_MAILER" value="array"/>
28
+        <env name="QUEUE_CONNECTION" value="sync"/>
29
+        <env name="SESSION_DRIVER" value="array"/>
30
+        <env name="PULSE_ENABLED" value="false"/>
31
+        <env name="TELESCOPE_ENABLED" value="false"/>
32
+        <env name="NIGHTWATCH_ENABLED" value="false"/>
33
+    </php>
34
+</phpunit>

+ 25
- 0
public/.htaccess 查看文件

@@ -0,0 +1,25 @@
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
+    # Handle X-XSRF-Token Header
13
+    RewriteCond %{HTTP:x-xsrf-token} .
14
+    RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}]
15
+
16
+    # Redirect Trailing Slashes If Not A Folder...
17
+    RewriteCond %{REQUEST_FILENAME} !-d
18
+    RewriteCond %{REQUEST_URI} (.+)/$
19
+    RewriteRule ^ %1 [L,R=301]
20
+
21
+    # Send Requests To Front Controller...
22
+    RewriteCond %{REQUEST_FILENAME} !-d
23
+    RewriteCond %{REQUEST_FILENAME} !-f
24
+    RewriteRule ^ index.php [L]
25
+</IfModule>

+ 1
- 0
public/css/filament/filament/app.css
文件差异内容过多而无法显示
查看文件


+ 49
- 0
public/css/filament/forms/forms.css
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/css/filament/support/support.css 查看文件

@@ -0,0 +1 @@
1
+.fi-pagination-items,.fi-pagination-overview,.fi-pagination-records-per-page-select:not(.fi-compact){display:none}@supports (container-type:inline-size){.fi-pagination{container-type:inline-size}@container (min-width: 28rem){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@container (min-width: 56rem){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}@supports not (container-type:inline-size){@media (min-width:640px){.fi-pagination-records-per-page-select.fi-compact{display:none}.fi-pagination-records-per-page-select:not(.fi-compact){display:inline}}@media (min-width:768px){.fi-pagination:not(.fi-simple)>.fi-pagination-previous-btn{display:none}.fi-pagination-overview{display:inline}.fi-pagination:not(.fi-simple)>.fi-pagination-next-btn{display:none}.fi-pagination-items{display:flex}}}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{background-color:#333;border-radius:4px;color:#fff;font-size:14px;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{color:#333;height:16px;width:16px}.tippy-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.tippy-content{padding:5px 9px;position:relative;z-index:1}.tippy-box[data-theme~=light]{background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926;color:#26323d}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.fi-sortable-ghost{opacity:.3}

+ 0
- 0
public/favicon.ico 查看文件


+ 20
- 0
public/index.php 查看文件

@@ -0,0 +1,20 @@
1
+<?php
2
+
3
+use Illuminate\Foundation\Application;
4
+use Illuminate\Http\Request;
5
+
6
+define('LARAVEL_START', microtime(true));
7
+
8
+// Determine if the application is in maintenance mode...
9
+if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
10
+    require $maintenance;
11
+}
12
+
13
+// Register the Composer autoloader...
14
+require __DIR__.'/../vendor/autoload.php';
15
+
16
+// Bootstrap Laravel and handle the request...
17
+/** @var Application $app */
18
+$app = require_once __DIR__.'/../bootstrap/app.php';
19
+
20
+$app->handleRequest(Request::capture());

+ 1
- 0
public/js/filament/filament/app.js
文件差异内容过多而无法显示
查看文件


+ 13
- 0
public/js/filament/filament/echo.js
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/js/filament/forms/components/color-picker.js
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/js/filament/forms/components/date-time-picker.js
文件差异内容过多而无法显示
查看文件


+ 123
- 0
public/js/filament/forms/components/file-upload.js
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/js/filament/forms/components/key-value.js 查看文件

@@ -0,0 +1 @@
1
+function r({state:o}){return{state:o,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows);this.rows=[];let s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.$nextTick(()=>{this.rows=e,this.updateState()})},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default};

+ 51
- 0
public/js/filament/forms/components/markdown-editor.js
文件差异内容过多而无法显示
查看文件


+ 150
- 0
public/js/filament/forms/components/rich-editor.js
文件差异内容过多而无法显示
查看文件


+ 6
- 0
public/js/filament/forms/components/select.js
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/js/filament/forms/components/tags-input.js 查看文件

@@ -0,0 +1 @@
1
+function i({state:a,splitKeys:n}){return{newTag:"",state:a,createTag:function(){if(this.newTag=this.newTag.trim(),this.newTag!==""){if(this.state.includes(this.newTag)){this.newTag="";return}this.state.push(this.newTag),this.newTag=""}},deleteTag:function(t){this.state=this.state.filter(e=>e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};

+ 1
- 0
public/js/filament/forms/components/textarea.js 查看文件

@@ -0,0 +1 @@
1
+function r({initialHeight:t,shouldAutosize:i,state:s}){return{state:s,wrapperEl:null,init:function(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight:function(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=t+"rem")},resize:function(){if(this.setInitialHeight(),this.$el.scrollHeight<=0)return;let e=this.$el.scrollHeight+"px";this.wrapperEl.style.height!==e&&(this.wrapperEl.style.height=e)},setUpResizeObserver:function(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{r as default};

+ 1
- 0
public/js/filament/notifications/notifications.js
文件差异内容过多而无法显示
查看文件


+ 46
- 0
public/js/filament/support/support.js
文件差异内容过多而无法显示
查看文件


+ 1
- 0
public/js/filament/tables/components/table.js 查看文件

@@ -0,0 +1 @@
1
+function d(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){this.isLoading=!0;let t=await this.$wire.getGroupedSelectableTableRecordKeys(e);this.areRecordsSelected(this.getRecordsInGroupOnPage(e))?this.deselectRecords(t):this.selectRecords(t),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let l=s.indexOf(this.lastChecked),r=s.indexOf(t),o=[l,r].sort((c,n)=>c-n),i=[];for(let c=o[0];c<=o[1];c++)s[c].checked=t.checked,i.push(s[c].value);t.checked?this.selectRecords(i):this.deselectRecords(i)}this.lastChecked=t}}}export{d as default};

+ 30
- 0
public/js/filament/widgets/components/chart.js
文件差异内容过多而无法显示
查看文件


+ 22
- 0
public/js/filament/widgets/components/stats-overview/stat/chart.js
文件差异内容过多而无法显示
查看文件


+ 2
- 0
public/robots.txt 查看文件

@@ -0,0 +1,2 @@
1
+User-agent: *
2
+Disallow:

+ 11
- 0
resources/css/app.css 查看文件

@@ -0,0 +1,11 @@
1
+@import 'tailwindcss';
2
+
3
+@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
4
+@source '../../storage/framework/views/*.php';
5
+@source '../**/*.blade.php';
6
+@source '../**/*.js';
7
+
8
+@theme {
9
+    --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
10
+        'Segoe UI Symbol', 'Noto Color Emoji';
11
+}

+ 1
- 0
resources/js/app.js 查看文件

@@ -0,0 +1 @@
1
+import './bootstrap';

+ 4
- 0
resources/js/bootstrap.js 查看文件

@@ -0,0 +1,4 @@
1
+import axios from 'axios';
2
+window.axios = axios;
3
+
4
+window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

+ 277
- 0
resources/views/welcome.blade.php
文件差异内容过多而无法显示
查看文件


+ 8
- 0
routes/console.php 查看文件

@@ -0,0 +1,8 @@
1
+<?php
2
+
3
+use Illuminate\Foundation\Inspiring;
4
+use Illuminate\Support\Facades\Artisan;
5
+
6
+Artisan::command('inspire', function () {
7
+    $this->comment(Inspiring::quote());
8
+})->purpose('Display an inspiring quote');

+ 7
- 0
routes/web.php 查看文件

@@ -0,0 +1,7 @@
1
+<?php
2
+
3
+use Illuminate\Support\Facades\Route;
4
+
5
+Route::get('/', function () {
6
+    return view('welcome');
7
+});

+ 4
- 0
storage/app/.gitignore 查看文件

@@ -0,0 +1,4 @@
1
+*
2
+!private/
3
+!public/
4
+!.gitignore

+ 2
- 0
storage/app/private/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 2
- 0
storage/app/public/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 9
- 0
storage/framework/.gitignore 查看文件

@@ -0,0 +1,9 @@
1
+compiled.php
2
+config.php
3
+down
4
+events.scanned.php
5
+maintenance.php
6
+routes.php
7
+routes.scanned.php
8
+schedule-*
9
+services.json

+ 3
- 0
storage/framework/cache/.gitignore 查看文件

@@ -0,0 +1,3 @@
1
+*
2
+!data/
3
+!.gitignore

+ 2
- 0
storage/framework/cache/data/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 2
- 0
storage/framework/sessions/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 2
- 0
storage/framework/testing/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 2
- 0
storage/framework/views/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 2
- 0
storage/logs/.gitignore 查看文件

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 19
- 0
tests/Feature/ExampleTest.php 查看文件

@@ -0,0 +1,19 @@
1
+<?php
2
+
3
+namespace Tests\Feature;
4
+
5
+// use Illuminate\Foundation\Testing\RefreshDatabase;
6
+use Tests\TestCase;
7
+
8
+class ExampleTest extends TestCase
9
+{
10
+    /**
11
+     * A basic test example.
12
+     */
13
+    public function test_the_application_returns_a_successful_response(): void
14
+    {
15
+        $response = $this->get('/');
16
+
17
+        $response->assertStatus(200);
18
+    }
19
+}

+ 10
- 0
tests/TestCase.php 查看文件

@@ -0,0 +1,10 @@
1
+<?php
2
+
3
+namespace Tests;
4
+
5
+use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
6
+
7
+abstract class TestCase extends BaseTestCase
8
+{
9
+    //
10
+}

+ 16
- 0
tests/Unit/ExampleTest.php 查看文件

@@ -0,0 +1,16 @@
1
+<?php
2
+
3
+namespace Tests\Unit;
4
+
5
+use PHPUnit\Framework\TestCase;
6
+
7
+class ExampleTest extends TestCase
8
+{
9
+    /**
10
+     * A basic test example.
11
+     */
12
+    public function test_that_true_is_true(): void
13
+    {
14
+        $this->assertTrue(true);
15
+    }
16
+}

+ 13
- 0
vite.config.js 查看文件

@@ -0,0 +1,13 @@
1
+import { defineConfig } from 'vite';
2
+import laravel from 'laravel-vite-plugin';
3
+import tailwindcss from '@tailwindcss/vite';
4
+
5
+export default defineConfig({
6
+    plugins: [
7
+        laravel({
8
+            input: ['resources/css/app.css', 'resources/js/app.js'],
9
+            refresh: true,
10
+        }),
11
+        tailwindcss(),
12
+    ],
13
+});