feat: 更新数据库填充器以支持开发环境的管理员和玩家数据填充,新增示例钱包余额配置

This commit is contained in:
2026-05-08 16:33:43 +08:00
parent 8954325194
commit 8cce1778b9
6 changed files with 263 additions and 1 deletions

View File

@@ -0,0 +1,71 @@
<?php
namespace Database\Seeders;
use App\Models\AdminUser;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 后台角色super_admin、若干权限占位本地演示**admin@admin.com** / **123456**(仅限非 production
*/
class AdminRbacAndUserSeeder extends Seeder
{
public function run(): void
{
$now = now();
DB::table('admin_roles')->updateOrInsert(
['slug' => 'super_admin'],
[
'name' => 'Super Admin',
'created_at' => $now,
'updated_at' => $now,
],
);
/** @var int $rid */
$rid = (int) DB::table('admin_roles')->where('slug', 'super_admin')->value('id');
$perms = [
['slug' => 'admin.dashboard', 'name' => 'Dashboard'],
['slug' => 'admin.players.read', 'name' => 'View players'],
['slug' => 'admin.wallet.read', 'name' => 'View wallets'],
];
foreach ($perms as $p) {
DB::table('admin_permissions')->updateOrInsert(
['slug' => $p['slug']],
[
'name' => $p['name'],
'created_at' => $now,
'updated_at' => $now,
],
);
}
$pidRows = DB::table('admin_permissions')->whereIn('slug', array_column($perms, 'slug'))->pluck('id');
foreach ($pidRows as $pid) {
DB::table('admin_role_permissions')->updateOrInsert(
['role_id' => $rid, 'permission_id' => $pid],
[],
);
}
$email = 'admin@admin.com';
AdminUser::query()->updateOrCreate(
['email' => $email],
[
'name' => 'admin',
/** 明文;模型 casts `password => hashed`,勿在生产库使用种子弱口令 */
'password' => '123456',
'status' => 0,
],
);
/** @var int $uid */
$uid = (int) AdminUser::query()->where('email', $email)->value('id');
DB::table('admin_user_roles')->updateOrInsert(
['admin_user_id' => $uid, 'role_id' => $rid],
[],
);
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 写入 `currencies`,与 `docs/04``LOTTERY_DEFAULT_CURRENCY` 对齐。
*/
class CurrencySeeder extends Seeder
{
public function run(): void
{
$rows = [
[
'code' => 'NPR',
'name' => 'Nepalese Rupee',
'decimal_places' => 2,
'is_enabled' => true,
'is_bettable' => true,
],
[
'code' => 'USD',
'name' => 'US Dollar',
'decimal_places' => 2,
'is_enabled' => true,
'is_bettable' => false,
],
];
foreach ($rows as $row) {
DB::table('currencies')->updateOrInsert(
['code' => $row['code']],
[
'name' => $row['name'],
'decimal_places' => $row['decimal_places'],
'is_enabled' => $row['is_enabled'],
'is_bettable' => $row['is_bettable'],
'created_at' => now(),
'updated_at' => now(),
],
);
}
}
}

View File

@@ -11,6 +11,18 @@ class DatabaseSeeder extends Seeder
public function run(): void
{
// 后台账号:后续可加 AdminUserSeeder玩家players 由 SSO 映射写入
// 全环境可用的基础枚举数据
$this->call([
CurrencySeeder::class,
PlayTypeSeeder::class,
]);
// 演示管理员 + 演示玩家:**勿在生产库执行**(或确保 APP_ENV≠production
if (! app()->environment('production')) {
$this->call([
AdminRbacAndUserSeeder::class,
DevPlayerAndWalletSeeder::class,
]);
}
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace Database\Seeders;
use App\Models\Player;
use App\Models\PlayerWallet;
use Illuminate\Database\Seeder;
/**
* 【本地演示】写入一条玩家 + 彩票钱包NPR
* 配合 `Bearer dev:{players.id}` `/api/v1/wallet/balance` 调试。
*
* fixed site_code + site_player_id 便于之后在 JWT / 脚本里对上号(非生产数据)。
*/
class DevPlayerAndWalletSeeder extends Seeder
{
public function run(): void
{
$currency = strtoupper(config('lottery.default_currency', 'NPR'));
$player = Player::query()->updateOrCreate(
[
'site_code' => 'demo',
'site_player_id' => 'demo-player-001',
],
[
'username' => 'demo_player',
'nickname' => 'Demo Player',
'default_currency' => $currency,
'status' => 0,
],
);
PlayerWallet::query()->updateOrCreate(
[
'player_id' => $player->id,
'wallet_type' => 'lottery',
'currency_code' => $currency,
],
[
/** 最小货币单位整数:示例 125000仅演示可由 .env 覆盖 */
'balance' => (int) env('DEV_SEED_WALLET_BALANCE_MINOR', 125_000),
'frozen_balance' => (int) env('DEV_SEED_WALLET_FROZEN_MINOR', 0),
'status' => 0,
'version' => 0,
],
);
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* 首期玩法占位数据play_code `docs/04` 玩法编码(小写)一致,便于前端/配置对齐。
*/
class PlayTypeSeeder extends Seeder
{
public function run(): void
{
$defaults = ['created_at' => now(), 'updated_at' => now()];
$rows = [
[
'play_code' => 'big',
'category' => 'standard',
'dimension' => 2,
'bet_mode' => null,
'display_name_zh' => 'Big',
'display_name_en' => 'Big',
'display_name_ne' => 'Big',
'is_enabled' => true,
'sort_order' => 10,
'supports_multi_number' => false,
'reserved_rule_json' => null,
],
[
'play_code' => 'small',
'category' => 'standard',
'dimension' => 2,
'bet_mode' => null,
'display_name_zh' => 'Small',
'display_name_en' => 'Small',
'display_name_ne' => 'Small',
'is_enabled' => true,
'sort_order' => 20,
'supports_multi_number' => false,
'reserved_rule_json' => null,
],
[
'play_code' => 'head',
'category' => 'digit',
'dimension' => 2,
'bet_mode' => null,
'display_name_zh' => 'Head',
'display_name_en' => 'Head',
'display_name_ne' => 'Head',
'is_enabled' => true,
'sort_order' => 30,
'supports_multi_number' => false,
'reserved_rule_json' => null,
],
[
'play_code' => 'tail',
'category' => 'digit',
'dimension' => 2,
'bet_mode' => null,
'display_name_zh' => 'Tail',
'display_name_en' => 'Tail',
'display_name_ne' => 'Tail',
'is_enabled' => true,
'sort_order' => 40,
'supports_multi_number' => false,
'reserved_rule_json' => null,
],
];
foreach ($rows as $row) {
DB::table('play_types')->updateOrInsert(
['play_code' => $row['play_code']],
array_merge($row, $defaults),
);
}
}
}