feat: 更新数据库填充器以支持开发环境的管理员和玩家数据填充,新增示例钱包余额配置
This commit is contained in:
@@ -76,6 +76,11 @@ LOTTERY_DEFAULT_CURRENCY=NPR
|
|||||||
# 本地开发:Bearer dev:{数据库 players.id}(仅 APP_ENV=local 且为 true 时生效)
|
# 本地开发:Bearer dev:{数据库 players.id}(仅 APP_ENV=local 且为 true 时生效)
|
||||||
LOTTERY_PLAYER_AUTH_DEV_BYPASS=false
|
LOTTERY_PLAYER_AUTH_DEV_BYPASS=false
|
||||||
|
|
||||||
|
# db:seed — 管理员种子为 admin@admin.com / 123456(非 production);勿用于生产库
|
||||||
|
# db:seed — 演示玩家钱包余额(最小货币单位整数)
|
||||||
|
# DEV_SEED_WALLET_BALANCE_MINOR=125000
|
||||||
|
# DEV_SEED_WALLET_FROZEN_MINOR=0
|
||||||
|
|
||||||
# JWT 内站点/玩家字段名(与主站签发约定一致)
|
# JWT 内站点/玩家字段名(与主站签发约定一致)
|
||||||
# LOTTERY_JWT_ALGORITHM=HS256
|
# LOTTERY_JWT_ALGORITHM=HS256
|
||||||
# LOTTERY_JWT_CLAIM_SITE_CODE=site_code
|
# LOTTERY_JWT_CLAIM_SITE_CODE=site_code
|
||||||
|
|||||||
71
database/seeders/AdminRbacAndUserSeeder.php
Normal file
71
database/seeders/AdminRbacAndUserSeeder.php
Normal 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],
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
46
database/seeders/CurrencySeeder.php
Normal file
46
database/seeders/CurrencySeeder.php
Normal 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(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,18 @@ class DatabaseSeeder extends Seeder
|
|||||||
|
|
||||||
public function run(): void
|
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,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
49
database/seeders/DevPlayerAndWalletSeeder.php
Normal file
49
database/seeders/DevPlayerAndWalletSeeder.php
Normal 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,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
79
database/seeders/PlayTypeSeeder.php
Normal file
79
database/seeders/PlayTypeSeeder.php
Normal 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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user