Parcourir la source

create tenant

peterguo il y a 2 mois
Parent
commit
ba32f83058

+ 13 - 0
app/Admin/Controllers/DomainController.php

@@ -2,6 +2,7 @@
 
 namespace App\Admin\Controllers;
 
+use App\Models\Tenant;
 use Encore\Admin\Controllers\AdminController;
 use Encore\Admin\Form;
 use Encore\Admin\Grid;
@@ -79,4 +80,16 @@ class DomainController extends AdminController
 
         return $show;
     }
+
+    protected function form()
+    {
+        $form = new Form(new Domain());
+
+        $form->text('domain', 'Domain')->rules('required');
+        $form->select('tenant_id', 'Tenant ID')
+            ->options(Tenant::all()->pluck('name','id'))->rules('required')
+            ->default(request()->get('tenant_id'));
+
+        return $form;
+    }
 }

+ 28 - 16
app/Admin/Controllers/GlobalUserController.php

@@ -3,6 +3,7 @@
 namespace App\Admin\Controllers;
 
 
+use App\Events\GlobalUserCreated;
 use App\Models\GlobalUser;
 use App\Models\Tenant;
 use Encore\Admin\Controllers\AdminController;
@@ -10,6 +11,7 @@ use Encore\Admin\Form;
 use Encore\Admin\Grid;
 use Encore\Admin\Show;
 use Encore\Admin\Widgets\Table;
+use Stancl\Tenancy\Database\Models\Domain;
 
 class GlobalUserController extends AdminController
 {
@@ -37,9 +39,7 @@ class GlobalUserController extends AdminController
         });
         $grid->column('created_at')->datetime();
         $grid->column('updated_at')->datetime();
-        $grid->actions(function (Grid\Displayers\Actions $actions) {
-            $actions->disableDelete();
-        });
+        $grid->disableActions();
 
         $grid->filter(function (Grid\Filter $filter) {
             $filter->like('username');
@@ -79,22 +79,34 @@ class GlobalUserController extends AdminController
         return $show;
     }
 
-    /**
-     * Make a form builder.
-     *
-     * @return Form
-     */
     protected function form()
     {
         $form = new Form(new GlobalUser());
-        $form->text('username')->placeholder('unique email or mobile')->rules(function ($form) {
-            return 'required|unique:global_users,username,' . $form->model()->id;
-        })->required();
-        $form->select('tenant_id', 'Tenant')
-            ->options(function () {
-                return Tenant::all()->pluck('name', 'id')->toArray();
-            })
-            ->required();
+        $form->select('tenant_id', 'Tenant ID')
+            ->options(Tenant::all()->pluck('name','id'))->rules('required')
+            ->default(request()->get('tenant_id'));
+
+        $form->text('username')->placeholder('unique email or phone')->rules('required');
+        $form->text('password')->rules('required');
+        $form->display('role')->default("超级管理员");
+
+        $user = [
+            'username' => $form->username,
+            'password' => $form->password,
+            'tenant_id' => $form->tenant_id,
+        ];
+
+        // callback before save
+        $form->saving(function (Form $form) {
+            $form->ignore('password');
+            $form->ignore('role');
+        });
+
+        // callback after save
+        $form->saved(function (Form $form) use ($user) {
+            event(new GlobalUserCreated($user));
+        });
+
         return $form;
     }
 }

+ 38 - 6
app/Admin/Controllers/TenantController.php

@@ -3,11 +3,13 @@
 namespace App\Admin\Controllers;
 
 
+use App\Models\GlobalUser;
 use App\Models\Tenant;
 use Encore\Admin\Controllers\AdminController;
 use Encore\Admin\Form;
 use Encore\Admin\Grid;
 use Encore\Admin\Show;
+use Encore\Admin\Widgets\Table;
 
 class TenantController extends AdminController
 {
@@ -24,10 +26,21 @@ class TenantController extends AdminController
         $grid = new Grid(new Tenant(['domains']));
 
         $grid->model()->orderByDesc('created_at');
+        $databaseConfig = config('database.connections');
 
         $grid->column('id')->copyable();
         $grid->column('name');
-        $grid->column('tenancy_db_connection', 'tenancy_db_connection');
+        $grid->column('email');
+        $grid->column('tenancy_db_connection')->expand(function ($model) use ($databaseConfig) {
+            $config = $databaseConfig[$model->tenancy_db_connection] ?? [];
+            return new Table(['name', 'config'], [
+                [
+                    $model->tenancy_db_connection,
+                    json_encode(['host' => $config['host'], 'port' => $config['port'], 'database' => $config['database']])
+                ]
+            ]);
+        });
+
         $grid->column('domains')->display(function ($domains) {
             if (count($domains) == 0) {
                 return '-';
@@ -39,8 +52,13 @@ class TenantController extends AdminController
             return $domainString;
         });
         $grid->column('expired_at')->datetime();
-        $grid->column('created_at')->datetime();
-        $grid->column('updated_at')->datetime();
+        $grid->created_at()->display(function ($createdAt) {
+            return date('Y-m-d H:i:s', strtotime($createdAt));
+        });
+        $grid->updated_at()->display(function ($updateAt) {
+            return date('Y-m-d H:i:s', strtotime($updateAt));
+        });
+
         $grid->actions(function (Grid\Displayers\Actions $actions) {
             $actions->disableDelete();
         });
@@ -64,6 +82,7 @@ class TenantController extends AdminController
         $show = new Show(Tenant::query()->findOrFail($id));
         $show->field('id');
         $show->field('name');
+        $show->field('email');
         $show->field('tenancy_db_connection');
         $show->field('expired_at');
         $show->field('created_at');
@@ -74,6 +93,7 @@ class TenantController extends AdminController
             $domain->domain();
             $domain->created_at();
             $domain->updated_at();
+            $domain->resource('/admin/domain');
         });
 
         $show->users('users', function ($user) {
@@ -81,6 +101,7 @@ class TenantController extends AdminController
             $user->username();
             $user->created_at();
             $user->updated_at();
+            $user->resource('/admin/globalUser');
         });
 
         return $show;
@@ -98,10 +119,15 @@ class TenantController extends AdminController
         foreach ($databaseConfig as $key => $item) {
             $databaseConnections[$key] = $key;
         }
-        $form = new Form(new Tenant(['domains']));
-        $form->tab('基本信息', function (Form $form) use ($databaseConnections) {
-            $form->text('id')->rules('required');
+        $form = new Form(new Tenant(['domains', 'users']));
+
+        // 从URL中获取 tenant_id
+        $tenantId = request()->route('tenant_id');
+
+        $form->tab('基本信息', function (Form $form) use ($databaseConnections, $tenantId) {
+            $form->text('id')->rules('required')->default($tenantId); // 设置默认值为 tenant_id
             $form->text('name');
+            $form->text('email');
             $form->radio('tenancy_db_connection')
                 ->options($databaseConnections)->default('mysql');;
             $form->datetime('expired_at');
@@ -110,6 +136,12 @@ class TenantController extends AdminController
                 $form->text('domain');
             });
         });
+
+        $form->hasMany("users", 'users', function (Form\NestedForm $form) {
+            $form->text('username')->value($form->id);
+            $form->text('tenant_id')->value($form->id);
+        });
+
         return $form;
     }
 }

+ 1 - 1
app/Admin/routes.php

@@ -14,7 +14,7 @@ Route::group([
     // 租户管理
     $router->resource('/tenant', 'TenantController');
     // 域名管理
-    $router->resource('/domain', 'DomainController')->only(['index', 'destroy', 'show']);
+    $router->resource('/domain', 'DomainController');
     // 用户管理
     $router->resource('/globalUser', 'GlobalUserController');
 });

+ 1 - 0
app/Console/Commands/InitializeRoutePermission.php

@@ -56,6 +56,7 @@ class InitializeRoutePermission extends Command
         $superAdminRole = [
             'id' => $superAdminRoleId,
             'name' => 'admin',
+            'guard_name' => 'api',
             'description' => '管理员权限'
         ];
         $role = Role::query()->firstOrCreate(['id' => $superAdminRoleId], $superAdminRole);

+ 0 - 34
app/Jobs/InitTenantData.php

@@ -1,34 +0,0 @@
-<?php
-
-namespace App\Jobs;
-
-use Illuminate\Bus\Queueable;
-use Illuminate\Contracts\Queue\ShouldQueue;
-use Illuminate\Foundation\Bus\Dispatchable;
-use Illuminate\Queue\InteractsWithQueue;
-use Illuminate\Queue\SerializesModels;
-use Illuminate\Support\Facades\Artisan;
-use Stancl\Tenancy\Contracts\TenantWithDatabase;
-
-class InitTenantData implements ShouldQueue
-{
-    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
-
-    protected TenantWithDatabase $tenant;
-
-    public function __construct(TenantWithDatabase $tenant)
-    {
-        $this->tenant = $tenant;
-    }
-
-    /**
-     * Execute the job.
-     */
-    public function handle(): void
-    {
-        Artisan::call('tenants:run', [
-            'commandname' => 'lpc:initialize-route-permission',
-            '--tenants' => [$this->tenant->getTenantKey()],
-        ]);
-    }
-}

+ 0 - 6
app/Providers/TenancyServiceProvider.php

@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace App\Providers;
 
 use App\Http\Middleware\GetTenancyByUsername;
-use App\Jobs\InitTenantData;
 use Illuminate\Support\Facades\Event;
 use Illuminate\Support\Facades\Route;
 use Illuminate\Support\ServiceProvider;
@@ -65,11 +64,6 @@ class TenancyServiceProvider extends ServiceProvider
             Events\DatabaseCreated::class => [],
             Events\DatabaseMigrated::class => [],
             Events\SeedingDatabase::class => [
-                JobPipeline::make([
-                    InitTenantData::class,
-                ])->send(function (Events\SeedingDatabase $event) {
-                    return $event->tenant;
-                })->shouldBeQueued(false)
             ],
             Events\DatabaseSeeded::class => [],
             Events\DatabaseRolledBack::class => [],

+ 2 - 0
database/migrations/2025_01_07_114133_add_columns_to_tenants_table.php

@@ -14,6 +14,7 @@ return new class extends Migration
         Schema::table('tenants', function (Blueprint $table) {
             //
             $table->string('name');
+            $table->string('email');
             $table->timestamp('expired_at')->nullable();
         });
     }
@@ -26,6 +27,7 @@ return new class extends Migration
         Schema::table('tenants', function (Blueprint $table) {
             //
             $table->dropColumn('name');
+            $table->dropColumn('email');
             $table->dropColumn('expired_at');
         });
     }

+ 5 - 5
database/seeders/DatabaseSeeder.php

@@ -4,6 +4,7 @@ namespace Database\Seeders;
 
 // use Illuminate\Database\Console\Seeds\WithoutModelEvents;
 use Illuminate\Database\Seeder;
+use Illuminate\Support\Facades\Artisan;
 
 class DatabaseSeeder extends Seeder
 {
@@ -12,11 +13,10 @@ class DatabaseSeeder extends Seeder
      */
     public function run(): void
     {
-        // \App\Models\User::factory(10)->create();
+        // Initialize route permission
+        Artisan::call('lpc:initialize-route-permission');
 
-        // \App\Models\User::factory()->create([
-        //     'name' => 'Test User',
-        //     'email' => 'test@example.com',
-        // ]);
+        // Initialize super admin
+        $this->call(SuperAdminSeeder::class);
     }
 }

+ 32 - 0
database/seeders/SuperAdminSeeder.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Company;
+use App\Models\Role;
+use Illuminate\Database\Seeder;
+use App\Models\User;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Str;
+
+class SuperAdminSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     */
+    public function run(): void
+    {
+        $user = User::create([
+            'name' => tenant()->id,
+            'email' => tenant()->email,
+            'email_verified_at' => now(),
+            'password' => Hash::make(tenant()->id),
+            'remember_token' => Str::random(10),
+            'username' => tenant()->id,
+            'company_id' => Company::query()->firstOrCreate(['name' => tenant()->id, 'email' => tenant()->email]),
+            'role_id' => config("auth.super_admin_role_id")
+        ]);
+        $role = Role::query()->findOrFail($user['role_id']);
+        $user->syncRoles($role);
+    }
+}