Browse Source

Fixed Bugs on install database

BrettonYe 2 years ago
parent
commit
bd63f0d3a5

+ 1 - 5
app/Http/Controllers/Admin/Config/SsConfigController.php

@@ -35,11 +35,7 @@ class SsConfigController extends Controller
     // 设置SS默认配置
     public function update(SsConfig $ss): JsonResponse
     {
-        // 去除该配置所属类型的默认值
-        SsConfig::default()->type($ss->type)->update(['is_default' => 0]);
-
-        // 将该ID对应记录值置为默认值
-        $ss->update(['is_default' => 1]);
+        $ss->setDefault();
 
         return Response::json(['status' => 'success', 'message' => '操作成功']);
     }

+ 10 - 6
app/Models/SsConfig.php

@@ -15,16 +15,20 @@ class SsConfig extends Model
 
     protected $guarded = [];
 
-    // 筛选默认
-
     public function scopeDefault($query): void
-    {
+    {  // 筛选默认
         $query->whereIsDefault(1);
     }
 
-    // 筛选类型
-    public function scopeType($query, $type): void
-    {
+    public function scopeType($query, int $type): void
+    { // 筛选类型
         $query->whereType($type);
     }
+
+    public function setDefault(): bool
+    { // 设置默认
+        self::type($this->type)->default()->update(['is_default' => 0]); // unset original default config
+
+        return $this->update(['is_default' => 1]);
+    }
 }

+ 0 - 1
app/Providers/AppServiceProvider.php

@@ -41,7 +41,6 @@ class AppServiceProvider extends ServiceProvider
      */
     public function boot(): void
     {
-        Schema::defaultStringLength(191);
         Paginator::useBootstrap();
 
         // 检测是否强制跳转https

File diff suppressed because it is too large
+ 182 - 226
database/schema/mysql-schema.sql


+ 24 - 84
database/seeders/ArticleSeeder.php

@@ -7,110 +7,50 @@ use Illuminate\Database\Seeder;
 
 class ArticleSeeder extends Seeder
 {
-    /**
-     * Run the database seeds.
-     */
+    /**     * Run the database seeds.     */
     public function run(): void
     {
         $articles = [
             '账号&服务' => [
                 255 => [
-                    '不运行软件,就连不上网,怎么办?', '<h4>方法一</h4>
-<p>电脑有安装任何电脑管家类的软件,都可以使用他们自带的网络修复工具来重置网络。</p>
-<h4>方法二</h4>
-<ol>
-<li>键盘操作<code>Win</code> + <code>X</code>,或右击左下角开始菜单键 (Win键看起来像 <i class="fa-brands fa-windows" aria-hidden="true"></i> 这样)</li>
-<li>按下 <code>A</code>键 或者 手动选择 <code>命令提示符(管理员)/ Windows PowerShell(管理员)</code></li>
-<li>输入<code>Netsh winsock reset</code> 后回车,再输入 <code>netsh advfirewall reset</code> 后回车;</li>
-</ol>',
-                ],
-
-                254 => [
-                    '为什么我的账号状态显示是禁用?', '<p>账号在2种情况下会显示禁用;</p>
-<ol>
-<li>套餐过期/流量枯竭;此情况您需要重新购买/重置 <a href="services">【服 务】</a>;</li>
-<li>近期流量使用异常;在<code>1小时</code>内使用流量超过 <code>10GB</code> ,即会触发本站的流量异常保护;保护时长为 <code>60分钟</code></li>
-</ol>
-<p>如您对禁用情况有疑问,可以创建<a href="tickets">【工 单】</a>,联系售后人员。</p>',
-                ],
-                253 => [
-                    '为什么我的订阅链接被禁用了?', '<p>订阅地址对于账号来说非常重要。所以本站对此设置了严格的限制措施,以防止用户无意间泄露给他人后,无法挽回。</p>
-<p>限制为: <code>24小时</code>内,订阅地址只允许请求 <code>20次</code></p>
-<p>解封,请在过一段时间并确定无误后,创建<a href="tickets">【工 单】</a>,联系售后人员</p>
-<p>小知识:如果您无意间的截图忘记将订阅地址打码了,您可以 点击上方 更换按钮</p>',
-                ],
-                252 => [
-                    '我想续费/购买服务,该怎么操作?', '<ol>
-<li>在线支付,本支付方式支持支付宝。支付后即开即用。前往 <a href="services">【服 务】</a> 选择想要购买的套餐,在订单界面选择<code>在线支付</code>即可。</li>
-<li>余额支付,本支付方法支持微信,支付宝。支付后需要等待充值到账,再购买服务。 ,充值后等待充值到账,一般会在<code>24小时</code>内到账,到账后可以在 <a href="services">【服 务】</a>页面查看您的账号余额。 在<a href="services">【服 务】</a> 选择想要购买的套餐,在订单界面选择<code>余额支付</code>即可。</li>
-</ol>',
+                    '不运行软件,就连不上网,怎么办?',
+                    '<h4>方法一</h4><p>电脑有安装任何电脑管家类的软件,都可以使用他们自带的网络修复工具来重置网络。</p><h4>方法二</h4><ol><li>键盘操作<code>Win</code> + <code>X</code>,或右击左下角开始菜单键 (Win键看起来像 <i class="fa-brands fa-windows" aria-hidden="true"></i> 这样)</li><li>按下 <code>A</code>键 或者 手动选择 <code>命令提示符(管理员)/ Windows PowerShell(管理员)</code></li><li>输入<code>Netsh winsock reset</code> 后回车,再输入 <code>netsh advfirewall reset</code> 后回车;</li></ol>',
+                ], 254 => [
+                    '为什么我的账号状态显示是禁用?',
+                    '<p>账号在2种情况下会显示禁用;</p><ol><li>套餐过期/流量枯竭;此情况您需要重新购买/重置 <a href="services">【服 务】</a>;</li><li>近期流量使用异常;在<code>1小时</code>内使用流量超过 <code>10GB</code> ,即会触发本站的流量异常保护;保护时长为 <code>60分钟</code></li></ol><p>如您对禁用情况有疑问,可以创建<a href="tickets">【工 单】</a>,联系售后人员。</p>',
+                ], 253 => [
+                    '为什么我的订阅链接被禁用了?',
+                    '<p>订阅地址对于账号来说非常重要。所以本站对此设置了严格的限制措施,以防止用户无意间泄露给他人后,无法挽回。</p><p>限制为: <code>24小时</code>内,订阅地址只允许请求 <code>20次</code></p><p>解封,请在过一段时间并确定无误后,创建<a href="tickets">【工 单】</a>,联系售后人员</p><p>小知识:如果您无意间的截图忘记将订阅地址打码了,您可以 点击上方 更换按钮</p>',
+                ], 252 => [
+                    '我想续费/购买服务,该怎么操作?',
+                    '<ol><li>在线支付,本支付方式支持支付宝。支付后即开即用。前往 <a href="services">【服 务】</a> 选择想要购买的套餐,在订单界面选择<code>在线支付</code>即可。</li><li>余额支付,本支付方法支持微信,支付宝。支付后需要等待充值到账,再购买服务。 ,充值后等待充值到账,一般会在<code>24小时</code>内到账,到账后可以在 <a href="services">【服 务】</a>页面查看您的账号余额。 在<a href="services">【服 务】</a> 选择想要购买的套餐,在订单界面选择<code>余额支付</code>即可。</li></ol>',
                 ], 251 => [
-                    '怎么样才能快速的联系上客服?', '<blockquote class="blockquote custom-blockquote blockquote-warning">请选择其一种方式联系客服,请勿重复发送请求!!!</blockquote>
-<ol>
-<li>在<a href="tickets">【工 单】</a>界面,创建新的工单,客服人员在上线后会在第一时刻处理。</li>
-</ol>',
+                    '怎么样才能快速的联系上客服?',
+                    '<blockquote class="blockquote custom-blockquote blockquote-warning">请选择其一种方式联系客服,请勿重复发送请求!!!</blockquote><ol><li>在<a href="tickets">【工 单】</a>界面,创建新的工单,客服人员在上线后会在第一时刻处理。</li></ol>',
                 ],
-            ],
-            '下载&教程' => [
+            ], '下载&教程' => [
                 99 => [
-                    'Windows', '<ol>
-<li><a href="clients/ShadowsocksR-win.zip" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li>
-<li>运行 ShadowsocksR 文件夹内的 ShadowsocksR.exe</li>
-<li>右击桌面右下角状态栏(或系统托盘)纸飞机 -&gt; 服务器订阅 -&gt; SSR服务器订阅设置</li>
-<li>点击窗口左下角 &ldquo;Add&rdquo; 新增订阅,完整复制本页上方 &ldquo;订阅服务&rdquo; 处地址,将其粘贴至&ldquo;网址&rdquo;栏,点击&ldquo;确定&rdquo;</li>
-<li>右击纸飞机 -&gt; 服务器订阅 -&gt; 更新SSR服务器订阅(不通过代理)</li>
-<li>右击纸飞机 -&gt; 服务器,选定合适服务器</li>
-<li>右击纸飞机 -&gt; 系统代理模式 -&gt; PAC模式</li>
-<li>右击纸飞机 -&gt; PAC -&gt; 更新PAC为GFWList</li>
-<li>右击纸飞机 -&gt; 代理规则 -&gt; 绕过局域网和大陆</li>
-<li>右击纸飞机,取消勾选&ldquo;服务器负载均衡&rdquo;</li>
-</ol>',
+                    'Windows',
+                    '<ol><li><a href="clients/ShadowsocksR-win.zip" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li><li>运行 ShadowsocksR 文件夹内的 ShadowsocksR.exe</li><li>右击桌面右下角状态栏(或系统托盘)纸飞机 -&gt; 服务器订阅 -&gt; SSR服务器订阅设置</li><li>点击窗口左下角 &ldquo;Add&rdquo; 新增订阅,完整复制本页上方 &ldquo;订阅服务&rdquo; 处地址,将其粘贴至&ldquo;网址&rdquo;栏,点击&ldquo;确定&rdquo;</li><li>右击纸飞机 -&gt; 服务器订阅 -&gt; 更新SSR服务器订阅(不通过代理)</li><li>右击纸飞机 -&gt; 服务器,选定合适服务器</li><li>右击纸飞机 -&gt; 系统代理模式 -&gt; PAC模式</li><li>右击纸飞机 -&gt; PAC -&gt; 更新PAC为GFWList</li><li>右击纸飞机 -&gt; 代理规则 -&gt; 绕过局域网和大陆</li><li>右击纸飞机,取消勾选&ldquo;服务器负载均衡&rdquo;</li></ol>',
                 ], 98 => [
-                    '安卓', '<ol>
-<li><a href="https://github.com/shadowsocksrr/shadowsocksr-android/releases/download/3.5.3/shadowsocksr-android-3.5.3.apk" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li>
-<li>单击左上角的shadowsocksR进入配置文件页,点击右下角的&ldquo;+&rdquo;号,点击&ldquo;添加/升级SSR订阅&rdquo;,完整复制本页上方&ldquo;订阅服务&rdquo;处地址,填入订阅信息并保存</li>
-<li>选中任意一个节点,返回软件首页</li>
-<li>在软件首页处找到&ldquo;路由&rdquo;选项,并将其改为&ldquo;绕过局域网及中国大陆地址&rdquo;</li>
-<li>点击右上角的小飞机图标进行连接,提示是否添加(或创建)VPN连接,点同意(或允许)</li>
-</ol>',
+                    '安卓',
+                    '<ol><li><a href="https://github.com/shadowsocksrr/shadowsocksr-android/releases/download/3.5.3/shadowsocksr-android-3.5.3.apk" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li><li>单击左上角的shadowsocksR进入配置文件页,点击右下角的&ldquo;+&rdquo;号,点击&ldquo;添加/升级SSR订阅&rdquo;,完整复制本页上方&ldquo;订阅服务&rdquo;处地址,填入订阅信息并保存</li><li>选中任意一个节点,返回软件首页</li><li>在软件首页处找到&ldquo;路由&rdquo;选项,并将其改为&ldquo;绕过局域网及中国大陆地址&rdquo;</li><li>点击右上角的小飞机图标进行连接,提示是否添加(或创建)VPN连接,点同意(或允许)</li></ol>',
                 ], 97 => [
-                    'iOS', '<ol>
-<li>请从站长处获取 App Store 账号密码</li>
-<li>打开 Shadowrocket,点击右上角 &ldquo;+&rdquo;号 添加节点,类型选择 Subscribe</li>
-<li>完整复制本页上方 &ldquo;订阅服务&rdquo; 处地址,将其粘贴至 &ldquo;URL&rdquo;栏,点击右上角 &ldquo;完成&rdquo;</li>
-<li>左划新增的服务器订阅,点击 &ldquo;更新&rdquo;</li>
-<li>选定合适服务器节点,点击右上角连接开关,屏幕上方状态栏出现&ldquo;VPN&rdquo;图标</li>
-<li>当进行海外游戏时请将 Shadowrocket &ldquo;首页&rdquo; 页面中的 &ldquo;全局路由&rdquo; 切换至 &ldquo;代理&rdquo;,并确保&ldquo;设置&rdquo;页面中的&ldquo;UDP&rdquo;已开启转发</li>
-</ol>',
+                    'iOS',
+                    '<ol><li>请从站长处获取 App Store 账号密码</li><li>打开 Shadowrocket,点击右上角 &ldquo;+&rdquo;号 添加节点,类型选择 Subscribe</li><li>完整复制本页上方 &ldquo;订阅服务&rdquo; 处地址,将其粘贴至 &ldquo;URL&rdquo;栏,点击右上角 &ldquo;完成&rdquo;</li><li>左划新增的服务器订阅,点击 &ldquo;更新&rdquo;</li><li>选定合适服务器节点,点击右上角连接开关,屏幕上方状态栏出现&ldquo;VPN&rdquo;图标</li><li>当进行海外游戏时请将 Shadowrocket &ldquo;首页&rdquo; 页面中的 &ldquo;全局路由&rdquo; 切换至 &ldquo;代理&rdquo;,并确保&ldquo;设置&rdquo;页面中的&ldquo;UDP&rdquo;已开启转发</li></ol>',
                 ], 96 => [
-                    'Mac', '<ol>
-<li><a href="clients/ShadowsocksX-NG-R8-1.4.6.dmg" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li>
-<li>点击状态栏纸飞机 -&gt; 服务器 -&gt; 编辑订阅</li>
-<li>点击窗口左下角 &ldquo;+&rdquo;号 新增订阅,完整复制本页上方&ldquo;订阅服务&rdquo;处地址,将其粘贴至&ldquo;订阅地址&rdquo;栏,点击右下角&ldquo;OK&rdquo;</li>
-<li>点击纸飞机 -&gt; 服务器 -&gt; 手动更新订阅</li>
-<li>点击纸飞机 -&gt; 服务器,选定合适服务器</li>
-<li>点击纸飞机 -&gt; 打开Shadowsocks</li>
-<li>点击纸飞机 -&gt; PAC自动模式</li>
-<li>点击纸飞机 -&gt; 代理设置-&gt;从 GFW List 更新 PAC</li>
-<li>打开系统偏好设置 -&gt; 网络,在窗口左侧选定显示为&ldquo;已连接&rdquo;的网络,点击右下角&ldquo;高级...&rdquo;</li>
-<li>切换至&ldquo;代理&rdquo;选项卡,勾选&ldquo;自动代理配置&rdquo;和&ldquo;不包括简单主机名&rdquo;,点击右下角&ldquo;好&rdquo;,再次点击右下角&ldquo;应用&rdquo;</li>
-</ol>',
+                    'Mac',
+                    '<ol><li><a href="clients/ShadowsocksX-NG-R8-1.4.6.dmg" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li><li>点击状态栏纸飞机 -&gt; 服务器 -&gt; 编辑订阅</li><li>点击窗口左下角 &ldquo;+&rdquo;号 新增订阅,完整复制本页上方&ldquo;订阅服务&rdquo;处地址,将其粘贴至&ldquo;订阅地址&rdquo;栏,点击右下角&ldquo;OK&rdquo;</li><li>点击纸飞机 -&gt; 服务器 -&gt; 手动更新订阅</li><li>点击纸飞机 -&gt; 服务器,选定合适服务器</li><li>点击纸飞机 -&gt; 打开Shadowsocks</li><li>点击纸飞机 -&gt; PAC自动模式</li><li>点击纸飞机 -&gt; 代理设置-&gt;从 GFW List 更新 PAC</li><li>打开系统偏好设置 -&gt; 网络,在窗口左侧选定显示为&ldquo;已连接&rdquo;的网络,点击右下角&ldquo;高级...&rdquo;</li><li>切换至&ldquo;代理&rdquo;选项卡,勾选&ldquo;自动代理配置&rdquo;和&ldquo;不包括简单主机名&rdquo;,点击右下角&ldquo;好&rdquo;,再次点击右下角&ldquo;应用&rdquo;</li></ol>',
                 ], 95 => [
-                    'Linux', '<ol>
-<li><a href="clients/Shadowsocks-qt5-3.0.1.zip" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li>
-<li>单击状态栏小飞机,找到服务器 -&gt; 编辑订阅,复制黏贴订阅地址</li>
-<li>更新订阅设置即可</li>
-</ol>',
+                    'Linux', '<ol><li><a href="clients/Shadowsocks-qt5-3.0.1.zip" target="_blank" rel="noopener">点击此处</a>下载客户端并启动</li><li>单击状态栏小飞机,找到服务器 -&gt; 编辑订阅,复制黏贴订阅地址</li><li>更新订阅设置即可</li></ol>',
                 ],
             ],
         ];
-
         foreach ($articles as $category => $article) {
             foreach ($article as $sort => $body) {
                 Article::create(['title' => $body[0], 'content' => $body[1], 'type' => 1, 'sort' => $sort, 'language' => 'zh_CN', 'category' => $category]);
             }
         }
-
         Article::create(['title' => 'Welcome! 欢迎!', 'content' => 'Welcome to ProxyPanel!<br> 欢迎使用ProxyPanel!', 'type' => 2, 'language' => 'zh_CN']);
     }
 }

+ 191 - 0
database/seeders/ConfigSeeder.php

@@ -0,0 +1,191 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Config;
+use Illuminate\Database\Seeder;
+
+class ConfigSeeder extends Seeder
+{
+    private array $configs = [
+        'account_expire_notification',
+        'active_times',
+        'admin_invite_days',
+        'aff_salt',
+        'alipay_qrcode',
+        'AppStore_id',
+        'AppStore_password',
+        'auto_release_port',
+        'bark_key',
+        'bitpay_secret',
+        'captcha_key',
+        'captcha_secret',
+        'codepay_id',
+        'codepay_key',
+        'codepay_url',
+        'data_anomaly_notification',
+        'data_exhaust_notification',
+        'ddns_key',
+        'ddns_mode',
+        'ddns_secret',
+        'default_days',
+        'default_traffic',
+        'detection_check_times',
+        'dingTalk_access_token',
+        'dingTalk_secret',
+        'epay_key',
+        'epay_mch_id',
+        'epay_url',
+        'expire_days',
+        'f2fpay_app_id',
+        'f2fpay_private_key',
+        'f2fpay_public_key',
+        'forbid_mode',
+        'invite_num',
+        'is_activate_account',
+        'is_AliPay',
+        'is_ban_status',
+        'is_captcha',
+        'is_checkin',
+        'is_clear_log',
+        'is_custom_subscribe',
+        'is_email_filtering',
+        'is_forbid_robot',
+        'is_free_code',
+        'is_invite_register',
+        'is_otherPay',
+        'is_push_bear',
+        'is_QQPay',
+        'is_rand_port',
+        'is_register',
+        'is_subscribe_ban',
+        'is_traffic_ban',
+        'is_WeChatPay',
+        'iYuu_token',
+        'maintenance_content',
+        'maintenance_mode',
+        'maintenance_time',
+        'max_port',
+        'max_rand_traffic',
+        'min_port',
+        'min_rand_traffic',
+        'node_blocked_notification',
+        'node_daily_notification',
+        'node_offline_notification',
+        'oauth_path',
+        'offline_check_times',
+        'password_reset_notification',
+        'paybeaver_app_id',
+        'paybeaver_app_secret',
+        'payjs_key',
+        'payjs_mch_id',
+        'payment_confirm_notification',
+        'payment_received_notification',
+        'paypal_app_id',
+        'paypal_client_id',
+        'paypal_client_secret',
+        'pushDeer_key',
+        'pushplus_token',
+        'rand_subscribe',
+        'redirect_url',
+        'referral_money',
+        'referral_percent',
+        'referral_status',
+        'referral_traffic',
+        'referral_type',
+        'register_ip_limit',
+        'reset_password_times',
+        'reset_traffic',
+        'server_chan_key',
+        'standard_currency',
+        'stripe_public_key',
+        'stripe_secret_key',
+        'stripe_signing_secret',
+        'subject_name',
+        'subscribe_ban_times',
+        'subscribe_domain',
+        'subscribe_max',
+        'telegram_token',
+        'tg_chat_token',
+        'theadpay_key',
+        'theadpay_mchid',
+        'theadpay_url',
+        'ticket_closed_notification',
+        'ticket_created_notification',
+        'ticket_replied_notification',
+        'traffic_ban_time',
+        'traffic_ban_value',
+        'traffic_limit_time',
+        'traffic_warning_percent',
+        'trojan_license',
+        'username_type',
+        'user_invite_days',
+        'v2ray_license',
+        'v2ray_tls_provider',
+        'webmaster_email',
+        'website_analytics',
+        'website_callback_url',
+        'website_customer_service',
+        'website_home_logo',
+        'website_logo',
+        'website_name',
+        'website_security_code',
+        'website_url',
+        'web_api_url',
+        'wechat_aid',
+        'wechat_cid',
+        'wechat_encodingAESKey',
+        'wechat_qrcode',
+        'wechat_secret',
+        'wechat_token',
+    ];
+
+    public function run(): void
+    { // 系统参数
+        foreach ($this->configs as $config) {
+            Config::insert(['name' => $config]);
+        }
+
+        $presetDates = [
+            'invite_num' => 3,
+            'is_register' => 1,
+            'is_invite_register' => 2,
+            'website_name' => 'ProxyPanel',
+            'reset_password_times' => 3,
+            'website_url' => 'https://demo.proxypanel.cf',
+            'active_times' => 3,
+            'is_checkin' => 1,
+            'min_rand_traffic' => 10,
+            'max_rand_traffic' => 500,
+            'traffic_limit_time' => 1440,
+            'referral_traffic' => 1024,
+            'referral_percent' => 0.2,
+            'referral_money' => 100,
+            'referral_status' => 1,
+            'default_traffic' => 1024,
+            'traffic_warning_percent' => 80,
+            'expire_days' => 15,
+            'reset_traffic' => 1,
+            'default_days' => 7,
+            'subscribe_max' => 3,
+            'min_port' => 10000,
+            'max_port' => 65535,
+            'is_traffic_ban' => 1,
+            'traffic_ban_value' => 10,
+            'traffic_ban_time' => 60,
+            'is_clear_log' => 1,
+            'is_subscribe_ban' => 1,
+            'subscribe_ban_times' => 20,
+            'auto_release_port' => 1,
+            'register_ip_limit' => 5,
+            'detection_check_times' => 3,
+            'user_invite_days' => 7,
+            'admin_invite_days' => 7,
+            'standard_currency' => 'CNY',
+        ];
+
+        foreach ($presetDates as $key => $value) {
+            Config::whereName($key)->update(['value' => $value]);
+        }
+    }
+}

+ 77 - 0
database/seeders/CountrySeeder.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Country;
+use Illuminate\Database\Seeder;
+
+class CountrySeeder extends Seeder
+{
+    private array $countries = [
+        'au' => '澳大利亚',
+        'br' => '巴西',
+        'ca' => '加拿大',
+        'ch' => '瑞士',
+        'cn' => '中国',
+        'de' => '德国',
+        'dk' => '丹麦',
+        'eg' => '埃及',
+        'fr' => '法国',
+        'gr' => '希腊',
+        'hk' => '香港',
+        'id' => '印度尼西亚',
+        'ie' => '爱尔兰',
+        'il' => '以色列',
+        'in' => '印度',
+        'iq' => '伊拉克',
+        'ir' => '伊朗',
+        'it' => '意大利',
+        'jp' => '日本',
+        'kr' => '韩国',
+        'mx' => '墨西哥',
+        'my' => '马来西亚',
+        'nl' => '荷兰',
+        'no' => '挪威',
+        'nz' => '纽西兰',
+        'ph' => '菲律宾',
+        'ru' => '俄罗斯',
+        'se' => '瑞典',
+        'sg' => '新加坡',
+        'th' => '泰国',
+        'tr' => '土耳其',
+        'tw' => '台湾',
+        'gb' => '英国',
+        'us' => '美国',
+        'vn' => '越南',
+        'pl' => '波兰',
+        'kz' => '哈萨克斯坦',
+        'ua' => '乌克兰',
+        'ro' => '罗马尼亚',
+        'ae' => '阿联酋',
+        'za' => '南非',
+        'mm' => '缅甸',
+        'is' => '冰岛',
+        'fi' => '芬兰',
+        'lu' => '卢森堡',
+        'be' => '比利时',
+        'bg' => '保加利亚',
+        'lt' => '立陶宛',
+        'co' => '哥伦比亚',
+        'mo' => '澳门',
+        'ke' => '肯尼亚',
+        'cz' => '捷克',
+        'md' => '摩尔多瓦',
+        'es' => '西班牙',
+        'pk' => '巴基斯坦',
+        'pt' => '葡萄牙',
+        'hu' => '匈牙利',
+        'ar' => '阿根廷',
+    ];
+
+    public function run(): void
+    {
+        foreach ($this->countries as $code => $name) {
+            Country::insert(['code' => $code, 'name' => $name]);
+        }
+    }
+}

+ 37 - 2
database/seeders/DatabaseSeeder.php

@@ -3,8 +3,17 @@
 namespace Database\Seeders;
 
 use App\Models\Article;
+use App\Models\Config;
+use App\Models\Country;
+use App\Models\EmailFilter;
+use App\Models\Label;
+use App\Models\Level;
+use App\Models\Rule;
+use App\Models\SsConfig;
 use App\Models\User;
+use App\Utils\Helpers;
 use Illuminate\Database\Seeder;
+use Spatie\Permission\Models\Role;
 
 class DatabaseSeeder extends Seeder
 {
@@ -13,10 +22,36 @@ class DatabaseSeeder extends Seeder
      */
     public function run(): void
     {
+        if (Config::doesntExist()) {
+            $this->call(ConfigSeeder::class);
+        }
+        if (Level::doesntExist()) {
+            $this->call(LevelSeeder::class);
+        }
+        if (Role::doesntExist()) {
+            $this->call(RBACSeeder::class);
+        }
         if (User::doesntExist()) {
-            $this->call(PresetSeeder::class);
+            // 生成初始管理账号
+            $user = Helpers::addUser('[email protected]', '123456', 100 * GB, sysConfig('default_days'), null, '管理员');
+            $user->update(['status' => 1]);
+            $user->assignRole('Super Admin');
+        }
+        if (Country::doesntExist()) {
+            $this->call(CountrySeeder::class);
+        }
+        if (Label::doesntExist()) {
+            $this->call(LabelSeeder::class);
+        }
+        if (Rule::doesntExist()) {
+            $this->call(RuleSeeder::class);
+        }
+        if (SsConfig::doesntExist()) {
+            $this->call(SsConfigSeeder::class);
+        }
+        if (EmailFilter::doesntExist()) {
+            $this->call(EmailFilterSeeder::class);
         }
-
         if (Article::doesntExist()) {
             $this->call(ArticleSeeder::class);
         }

+ 161 - 0
database/seeders/EmailFilterSeeder.php

@@ -0,0 +1,161 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\EmailFilter;
+use Illuminate\Database\Seeder;
+
+class EmailFilterSeeder extends Seeder
+{
+    private array $white = [ // 白名单 邮箱过滤列表
+        'qq.com',
+        '163.com',
+        '126.com',
+        '189.com',
+        'sohu.com',
+        'gmail.com',
+        'outlook.com',
+        'icloud.com',
+    ];
+
+    private array $black = [ // 黑名单 邮箱过滤列表
+        'chacuo.com',
+        '1766258.com',
+        '3202.com',
+        '4057.com',
+        '4059.com',
+        'a7996.com',
+        'bccto.me',
+        'bnuis.com',
+        'chaichuang.com',
+        'cr219.com',
+        'cuirushi.org',
+        'dawin.com',
+        'jiaxin8736.com',
+        'lakqs.com',
+        'urltc.com',
+        '027168.com',
+        '10minutemail.net',
+        '11163.com',
+        '1shivom.com',
+        'auoie.com',
+        'bareed.ws',
+        'bit-degree.com',
+        'cjpeg.com',
+        'cool.fr.nf',
+        'courriel.fr.nf',
+        'disbox.net',
+        'disbox.org',
+        'fidelium10.com',
+        'get365.pw',
+        'ggr.la',
+        'grr.la',
+        'guerrillamail.biz',
+        'guerrillamail.com',
+        'guerrillamail.de',
+        'guerrillamail.net',
+        'guerrillamail.org',
+        'guerrillamailblock.com',
+        'hubii-network.com',
+        'hurify1.com',
+        'itoup.com',
+        'jetable.fr.nf',
+        'jnpayy.com',
+        'juyouxi.com',
+        'mail.bccto.me',
+        'www.bccto.me',
+        'mega.zik.dj',
+        'moakt.co',
+        'moakt.ws',
+        'molms.com',
+        'moncourrier.fr.nf',
+        'monemail.fr.nf',
+        'monmail.fr.nf',
+        'nomail.xl.cx',
+        'nospam.ze.tc',
+        'pay-mon.com',
+        'poly-swarm.com',
+        'sgmh.online',
+        'sharklasers.com',
+        'shiftrpg.com',
+        'spam4.me',
+        'speed.1s.fr',
+        'tmail.ws',
+        'tmails.net',
+        'tmpmail.net',
+        'tmpmail.org',
+        'travala10.com',
+        'yopmail.com',
+        'yopmail.fr',
+        'yopmail.net',
+        'yuoia.com',
+        'zep-hyr.com',
+        'zippiex.com',
+        'lrc8.com',
+        '1otc.com',
+        'emailna.co',
+        'mailinator.com',
+        'nbzmr.com',
+        'awsoo.com',
+        'zhcne.com',
+        '0box.eu',
+        'contbay.com',
+        'damnthespam.com',
+        'kurzepost.de',
+        'objectmail.com',
+        'proxymail.eu',
+        'rcpt.at',
+        'trash-mail.at',
+        'trashmail.at',
+        'trashmail.com',
+        'trashmail.io',
+        'trashmail.me',
+        'trashmail.net',
+        'wegwerfmail.de',
+        'wegwerfmail.net',
+        'wegwerfmail.org',
+        'nwytg.net',
+        'despam.it',
+        'spambox.us',
+        'spam.la',
+        'mytrashmail.com',
+        'mt2014.com',
+        'mt2015.com',
+        'thankyou2010.com',
+        'trash2009.com',
+        'mt2009.com',
+        'trashymail.com',
+        'tempemail.net',
+        'slopsbox.com',
+        'mailnesia.com',
+        'ezehe.com',
+        'tempail.com',
+        'newairmail.com',
+        'temp-mail.org',
+        'linshiyouxiang.net',
+        'zwoho.com',
+        'mailboxy.fun',
+        'crypto-net.club',
+        'guerrillamail.info',
+        'pokemail.net',
+        'odmail.cn',
+        'hlooy.com',
+        'ozlaq.com',
+        '666email.com',
+        'linshiyou.com',
+        'linshiyou.pl',
+        'woyao.pl',
+        'yaowo.pl',
+    ];
+
+    public function run(): void
+    {
+        foreach ($this->black as $emailSuffix) {
+            EmailFilter::insert(['type' => 1, 'words' => $emailSuffix]);
+        }
+
+        foreach ($this->white as $emailSuffix) {
+            EmailFilter::insert(['type' => 2, 'words' => $emailSuffix]);
+        }
+    }
+}

+ 51 - 0
database/seeders/LabelSeeder.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Label;
+use Illuminate\Database\Seeder;
+
+class LabelSeeder extends Seeder
+{
+    private array $labels = [
+        'Netflix',
+        'Hulu',
+        'HBO',
+        'Amazon Video',
+        'DisneyNow',
+        'BBC',
+        'Channel 4',
+        'Fox+',
+        'Happyon',
+        'AbemeTV',
+        'DMM',
+        'NicoNico',
+        'Pixiv',
+        'TVer',
+        'TVB',
+        'HBO Go',
+        'BiliBili港澳台',
+        '動畫瘋',
+        '四季線上影視',
+        'LINE TV',
+        'Youtube Premium',
+        '中国视频网站',
+        '网易云音乐',
+        'QQ音乐',
+        'DisneyPlus',
+        'Pandora',
+        'SoundCloud',
+        'Spotify',
+        'TIDAL',
+        'TikTok',
+        'Pornhub',
+        'Twitch',
+    ];
+
+    public function run(): void
+    { // 节点用标签
+        foreach ($this->labels as $label) {
+            Label::insert(['name' => $label]);
+        }
+    }
+}

+ 17 - 0
database/seeders/LevelSeeder.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Level;
+use Illuminate\Database\Seeder;
+
+class LevelSeeder extends Seeder
+{
+    public function run(): void
+    {// 生成最初的等级
+        Level::insert(['level' => 0, 'name' => 'Free']);
+        for ($i = 1; $i < 8; $i++) {
+            Level::insert(['level' => $i, 'name' => 'VIP-'.$i]);
+        }
+    }
+}

+ 0 - 511
database/seeders/PresetSeeder.php

@@ -1,511 +0,0 @@
-<?php
-
-namespace Database\Seeders;
-
-use App\Models\Config;
-use App\Models\Country;
-use App\Models\EmailFilter;
-use App\Models\Label;
-use App\Models\Level;
-use App\Models\Rule;
-use App\Models\SsConfig;
-use Helpers;
-use Illuminate\Database\Seeder;
-
-class PresetSeeder extends Seeder
-{
-    /**
-     * Run the database seeds.
-     */
-    public function run(): void
-    {
-        // 系统参数
-        $configList = [
-            'is_rand_port',
-            'is_user_rand_port',
-            'invite_num',
-            'is_register',
-            'is_invite_register',
-            'website_name',
-            'is_reset_password',
-            'reset_password_times',
-            'website_url',
-            'referral_type',
-            'active_times',
-            'is_checkin',
-            'min_rand_traffic',
-            'max_rand_traffic',
-            'wechat_qrcode',
-            'alipay_qrcode',
-            'traffic_limit_time',
-            'referral_traffic',
-            'referral_percent',
-            'referral_money',
-            'referral_status',
-            'default_traffic',
-            'traffic_warning',
-            'traffic_warning_percent',
-            'expire_warning',
-            'expire_days',
-            'reset_traffic',
-            'default_days',
-            'subscribe_max',
-            'min_port',
-            'max_port',
-            'is_captcha',
-            'is_traffic_ban',
-            'traffic_ban_value',
-            'traffic_ban_time',
-            'is_clear_log',
-            'is_node_offline',
-            'webmaster_email',
-            'is_notification',
-            'server_chan_key',
-            'is_subscribe_ban',
-            'subscribe_ban_times',
-            'codepay_url',
-            'codepay_id',
-            'codepay_key',
-            'is_free_code',
-            'is_forbid_robot',
-            'subscribe_domain',
-            'auto_release_port',
-            'website_callback_url',
-            'web_api_url',
-            'v2ray_license',
-            'trojan_license',
-            'v2ray_tls_provider',
-            'website_analytics',
-            'website_customer_service',
-            'register_ip_limit',
-            'is_email_filtering',
-            'is_ban_status',
-            'is_namesilo',
-            'namesilo_key',
-            'website_logo',
-            'website_home_logo',
-            'nodes_detection',
-            'detection_check_times',
-            'is_forbid_china',
-            'is_forbid_oversea',
-            'AppStore_id',
-            'AppStore_password',
-            'is_activate_account',
-            'node_daily_report',
-            'rand_subscribe',
-            'is_custom_subscribe',
-            'is_AliPay',
-            'is_QQPay',
-            'is_WeChatPay',
-            'is_otherPay',
-            'alipay_private_key',
-            'alipay_public_key',
-            'alipay_transport',
-            'alipay_currency',
-            'bitpay_secret',
-            'f2fpay_app_id',
-            'f2fpay_private_key',
-            'f2fpay_public_key',
-            'website_security_code',
-            'subject_name',
-            'user_invite_days',
-            'admin_invite_days',
-            'offline_check_times',
-            'payjs_mch_id',
-            'payjs_key',
-            'maintenance_mode',
-            'maintenance_time',
-            'maintenance_content',
-            'bark_key',
-            'paypal_username',
-            'paypal_password',
-            'paypal_secret',
-            'paypal_certificate',
-            'paypal_app_id',
-            'redirect_url',
-            'epay_url',
-            'epay_mch_id',
-            'epay_key',
-        ];
-
-        foreach ($configList as $config) {
-            Config::insert(['name' => $config]);
-        }
-
-        $presetDates = [
-            'invite_num' => 3,
-            'is_register' => 1,
-            'is_invite_register' => 2,
-            'website_name' => 'ProxyPanel',
-            'is_reset_password' => 1,
-            'reset_password_times' => 3,
-            'website_url' => 'https://demo.proxypanel.cf',
-            'active_times' => 3,
-            'is_checkin' => 1,
-            'min_rand_traffic' => 10,
-            'max_rand_traffic' => 500,
-            'traffic_limit_time' => 1440,
-            'referral_traffic' => 1024,
-            'referral_percent' => 0.2,
-            'referral_money' => 100,
-            'referral_status' => 1,
-            'default_traffic' => 1024,
-            'traffic_warning_percent' => 80,
-            'expire_days' => 15,
-            'reset_traffic' => 1,
-            'default_days' => 7,
-            'subscribe_max' => 3,
-            'min_port' => 10000,
-            'max_port' => 65535,
-            'is_traffic_ban' => 1,
-            'traffic_ban_value' => 10,
-            'traffic_ban_time' => 60,
-            'is_clear_log' => 1,
-            'is_subscribe_ban' => 1,
-            'subscribe_ban_times' => 20,
-            'auto_release_port' => 1,
-            'register_ip_limit' => 5,
-            'detection_check_times' => 3,
-            'alipay_transport' => 'http',
-            'alipay_currency' => 'USD',
-            'user_invite_days' => 7,
-            'admin_invite_days' => 7,
-        ];
-
-        foreach ($presetDates as $key => $value) {
-            Config::whereName($key)->update(['value' => $value]);
-        }
-
-        // 生成最初的等级
-        Level::insert(['level' => 0, 'name' => 'Free']);
-        for ($i = 1; $i < 8; $i++) {
-            Level::insert(['level' => $i, 'name' => 'VIP-'.$i]);
-        }
-
-        // ss系列 加密方式
-        SsConfig::insert(['name' => 'none', 'type' => 1, 'is_default' => 1]);
-        SsConfig::insert(['name' => 'rc4-md5']);
-        SsConfig::insert(['name' => 'aes-128-cfb']);
-        SsConfig::insert(['name' => 'aes-192-cfb']);
-        SsConfig::insert(['name' => 'aes-256-cfb']);
-        SsConfig::insert(['name' => 'aes-128-ctr']);
-        SsConfig::insert(['name' => 'aes-192-ctr']);
-        SsConfig::insert(['name' => 'aes-256-ctr']);
-        SsConfig::insert(['name' => 'aes-128-gcm']);
-        SsConfig::insert(['name' => 'aes-192-gcm']);
-        SsConfig::insert(['name' => 'aes-256-gcm']);
-        SsConfig::insert(['name' => 'bf-cfb']);
-        SsConfig::insert(['name' => 'cast5-cfb']);
-        SsConfig::insert(['name' => 'des-cfb']);
-        SsConfig::insert(['name' => 'salsa20']);
-        SsConfig::insert(['name' => 'chacha20']);
-        SsConfig::insert(['name' => 'chacha20-ietf']);
-        SsConfig::insert(['name' => 'chacha20-ietf-poly1305']);
-
-        // ss系列 协议
-        SsConfig::insert(['name' => 'origin', 'type' => 2, 'is_default' => 1]);
-        SsConfig::insert(['name' => 'auth_sha1_v4', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_aes128_md5', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_aes128_sha1', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_a', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_b', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_c', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_d', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_e', 'type' => 2]);
-        SsConfig::insert(['name' => 'auth_chain_f', 'type' => 2]);
-
-        // ss系列 混淆
-        SsConfig::insert(['name' => 'plain', 'type' => 3, 'is_default' => 1]);
-        SsConfig::insert(['name' => 'http_simple', 'type' => 3]);
-        SsConfig::insert(['name' => 'http_post', 'type' => 3]);
-        SsConfig::insert(['name' => 'tls1.2_ticket_auth', 'type' => 3]);
-        SsConfig::insert(['name' => 'tls1.2_ticket_fastauth', 'type' => 3]);
-
-        // 节点用标签
-        $labelList = [
-            'Netflix',
-            'Hulu',
-            'HBO',
-            'Amazon Video',
-            'DisneyNow',
-            'BBC',
-            'Channel 4',
-            'Fox+',
-            'Happyon',
-            'AbemeTV',
-            'DMM',
-            'NicoNico',
-            'Pixiv',
-            'TVer',
-            'TVB',
-            'HBO Go',
-            'BiliBili港澳台',
-            '動畫瘋',
-            '四季線上影視',
-            'LINE TV',
-            'Youtube Premium',
-            '中国视频网站',
-            '网易云音乐',
-            'QQ音乐',
-            'DisneyPlus',
-            'Pandora',
-            'SoundCloud',
-            'Spotify',
-            'TIDAL',
-            'TikTok',
-            'Pornhub',
-            'Twitch',
-        ];
-
-        foreach ($labelList as $label) {
-            Label::insert(['name' => $label]);
-        }
-
-        // 黑名单邮箱 过滤列表
-        $blackEmailSuffixList = [
-            'chacuo.com',
-            '1766258.com',
-            '3202.com',
-            '4057.com',
-            '4059.com',
-            'a7996.com',
-            'bccto.me',
-            'bnuis.com',
-            'chaichuang.com',
-            'cr219.com',
-            'cuirushi.org',
-            'dawin.com',
-            'jiaxin8736.com',
-            'lakqs.com',
-            'urltc.com',
-            '027168.com',
-            '10minutemail.net',
-            '11163.com',
-            '1shivom.com',
-            'auoie.com',
-            'bareed.ws',
-            'bit-degree.com',
-            'cjpeg.com',
-            'cool.fr.nf',
-            'courriel.fr.nf',
-            'disbox.net',
-            'disbox.org',
-            'fidelium10.com',
-            'get365.pw',
-            'ggr.la',
-            'grr.la',
-            'guerrillamail.biz',
-            'guerrillamail.com',
-            'guerrillamail.de',
-            'guerrillamail.net',
-            'guerrillamail.org',
-            'guerrillamailblock.com',
-            'hubii-network.com',
-            'hurify1.com',
-            'itoup.com',
-            'jetable.fr.nf',
-            'jnpayy.com',
-            'juyouxi.com',
-            'mail.bccto.me',
-            'www.bccto.me',
-            'mega.zik.dj',
-            'moakt.co',
-            'moakt.ws',
-            'molms.com',
-            'moncourrier.fr.nf',
-            'monemail.fr.nf',
-            'monmail.fr.nf',
-            'nomail.xl.cx',
-            'nospam.ze.tc',
-            'pay-mon.com',
-            'poly-swarm.com',
-            'sgmh.online',
-            'sharklasers.com',
-            'shiftrpg.com',
-            'spam4.me',
-            'speed.1s.fr',
-            'tmail.ws',
-            'tmails.net',
-            'tmpmail.net',
-            'tmpmail.org',
-            'travala10.com',
-            'yopmail.com',
-            'yopmail.fr',
-            'yopmail.net',
-            'yuoia.com',
-            'zep-hyr.com',
-            'zippiex.com',
-            'lrc8.com',
-            '1otc.com',
-            'emailna.co',
-            'mailinator.com',
-            'nbzmr.com',
-            'awsoo.com',
-            'zhcne.com',
-            '0box.eu',
-            'contbay.com',
-            'damnthespam.com',
-            'kurzepost.de',
-            'objectmail.com',
-            'proxymail.eu',
-            'rcpt.at',
-            'trash-mail.at',
-            'trashmail.at',
-            'trashmail.com',
-            'trashmail.io',
-            'trashmail.me',
-            'trashmail.net',
-            'wegwerfmail.de',
-            'wegwerfmail.net',
-            'wegwerfmail.org',
-            'nwytg.net',
-            'despam.it',
-            'spambox.us',
-            'spam.la',
-            'mytrashmail.com',
-            'mt2014.com',
-            'mt2015.com',
-            'thankyou2010.com',
-            'trash2009.com',
-            'mt2009.com',
-            'trashymail.com',
-            'tempemail.net',
-            'slopsbox.com',
-            'mailnesia.com',
-            'ezehe.com',
-            'tempail.com',
-            'newairmail.com',
-            'temp-mail.org',
-            'linshiyouxiang.net',
-            'zwoho.com',
-            'mailboxy.fun',
-            'crypto-net.club',
-            'guerrillamail.info',
-            'pokemail.net',
-            'odmail.cn',
-            'hlooy.com',
-            'ozlaq.com',
-            '666email.com',
-            'linshiyou.com',
-            'linshiyou.pl',
-            'woyao.pl',
-            'yaowo.pl',
-        ];
-
-        foreach ($blackEmailSuffixList as $emailSuffix) {
-            EmailFilter::insert(['type' => 1, 'words' => $emailSuffix]);
-        }
-
-        // 白名单邮箱 过滤列表
-        $whiteEmailSuffixList = [
-            'qq.com',
-            '163.com',
-            '126.com',
-            '189.com',
-            'sohu.com',
-            'gmail.com',
-            'outlook.com',
-            'icloud.com',
-        ];
-
-        foreach ($whiteEmailSuffixList as $emailSuffix) {
-            EmailFilter::insert(['type' => 2, 'words' => $emailSuffix]);
-        }
-
-        $countryList = [
-            'au' => '澳大利亚',
-            'br' => '巴西',
-            'ca' => '加拿大',
-            'ch' => '瑞士',
-            'cn' => '中国',
-            'de' => '德国',
-            'dk' => '丹麦',
-            'eg' => '埃及',
-            'fr' => '法国',
-            'gr' => '希腊',
-            'hk' => '香港',
-            'id' => '印度尼西亚',
-            'ie' => '爱尔兰',
-            'il' => '以色列',
-            'in' => '印度',
-            'iq' => '伊拉克',
-            'ir' => '伊朗',
-            'it' => '意大利',
-            'jp' => '日本',
-            'kr' => '韩国',
-            'mx' => '墨西哥',
-            'my' => '马来西亚',
-            'nl' => '荷兰',
-            'no' => '挪威',
-            'nz' => '纽西兰',
-            'ph' => '菲律宾',
-            'ru' => '俄罗斯',
-            'se' => '瑞典',
-            'sg' => '新加坡',
-            'th' => '泰国',
-            'tr' => '土耳其',
-            'tw' => '台湾',
-            'uk' => '英国',
-            'us' => '美国',
-            'vn' => '越南',
-            'pl' => '波兰',
-            'kz' => '哈萨克斯坦',
-            'ua' => '乌克兰',
-            'ro' => '罗马尼亚',
-            'ae' => '阿联酋',
-            'za' => '南非',
-            'mm' => '缅甸',
-            'is' => '冰岛',
-            'fi' => '芬兰',
-            'lu' => '卢森堡',
-            'be' => '比利时',
-            'bg' => '保加利亚',
-            'lt' => '立陶宛',
-            'co' => '哥伦比亚',
-            'mo' => '澳门',
-            'ke' => '肯尼亚',
-            'cz' => '捷克',
-            'md' => '摩尔多瓦',
-            'es' => '西班牙',
-            'pk' => '巴基斯坦',
-            'pt' => '葡萄牙',
-            'hu' => '匈牙利',
-            'ar' => '阿根廷',
-        ];
-
-        foreach ($countryList as $code => $name) {
-            Country::insert(['code' => $code, 'name' => $name]);
-        }
-
-        // 审核规则
-        $ruleList = [
-            '360' => '(.*.||)(^360|0360|1360|3600|360safe|^so|qhimg|qhmsg|^yunpan|qihoo|qhcdn|qhupdate|360totalsecurity|360shouji|qihucdn|360kan|secmp).(cn|com|net)',
-            '腾讯管家' => '(.guanjia.qq.com|qqpcmgr|QQPCMGR)',
-            '金山毒霸' => '(.*.||)(rising|kingsoft|duba|xindubawukong|jinshanduba).(com|net|org)',
-            '暗网相关' => '(.*.||)(netvigator|torproject).(cn|com|net|org)',
-            '百度定位' => '(api|ps|sv|offnavi|newvector|ulog.imap|newloc|tracknavi)(.map|).(baidu|n.shifen).com',
-            '法轮功类' => '(.*.||)(dafahao|minghui|dongtaiwang|dajiyuan|falundata|shenyun|tuidang|epochweekly|epochtimes|ntdtv|falundafa|wujieliulan|zhengjian).(org|com|net)',
-            'BT扩展名' => '(torrent|.torrent|peer_id=|info_hash|get_peers|find_node|BitTorrent|announce_peer|announce.php?passkey=)',
-            '邮件滥发' => '((^.*@)(guerrillamail|guerrillamailblock|sharklasers|grr|pokemail|spam4|bccto|chacuo|027168).(info|biz|com|de|net|org|me|la)|Subject|HELO|SMTP)',
-            '迅雷下载' => '(.?)(xunlei|sandai|Thunder|XLLiveUD)(.)',
-            '大陆应用' => '(.*.||)(baidu|qq|163|189|10000|10010|10086|sohu|sogoucdn|sogou|uc|58|taobao|qpic|bilibili|hdslb|acgvideo|sina|douban|doubanio|xiaohongshu|sinaimg|weibo|xiaomi|youzanyun|meituan|dianping|biliapi|huawei|pinduoduo|cnzz).(org|com|net|cn)',
-            '大陆银行' => '(.*.||)(icbc|ccb|boc|bankcomm|abchina|cmbchina|psbc|cebbank|cmbc|pingan|spdb|citicbank|cib|hxb|bankofbeijing|hsbank|tccb|4001961200|bosc|hkbchina|njcb|nbcb|lj-bank|bjrcb|jsbchina|gzcb|cqcbank|czbank|hzbank|srcb|cbhb|cqrcb|grcbank|qdccb|bocd|hrbcb|jlbank|bankofdl|qlbchina|dongguanbank|cscb|hebbank|drcbank|zzbank|bsb|xmccb|hljrcc|jxnxs|gsrcu|fjnx|sxnxs|gx966888|gx966888|zj96596|hnnxs|ahrcu|shanxinj|hainanbank|scrcu|gdrcu|hbxh|ynrcc|lnrcc|nmgnxs|hebnx|jlnls|js96008|hnnx|sdnxs).(org|com|net|cn)',
-            '台湾银行' => '(.*.||)(firstbank|bot|cotabank|megabank|tcb-bank|landbank|hncb|bankchb|tbb|ktb|tcbbank|scsb|bop|sunnybank|kgibank|fubon|ctbcbank|cathaybk|eximbank|bok|ubot|feib|yuantabank|sinopac|esunbank|taishinbank|jihsunbank|entiebank|hwataibank|csc|skbank).(org|com|net|tw)',
-            '大陆第三方支付' => '(.*.||)(alipay|baifubao|yeepay|99bill|95516|51credit|cmpay|tenpay|lakala|jdpay).(org|com|net|cn)',
-            '台湾特供' => '(.*.||)(visa|mycard|mastercard|gov|gash|beanfun|bank|line).(org|com|net|cn|tw|jp|kr)',
-            '涉政治类' => '(.*.||)(shenzhoufilm|secretchina|renminbao|aboluowang|mhradio|guangming|zhengwunet|soundofhope|yuanming|zhuichaguoji|fgmtv|xinsheng|shenyunperformingarts|epochweekly|tuidang|shenyun|falundata|bannedbook|pincong|rfi|mingjingnews|boxun|rfa|scmp|ogate|voachinese).(org|com|net|rocks|fr)',
-            '流媒体' => '(.*.||)(youtube|googlevideo|hulu|netflix|nflxvideo|akamai|nflximg|hbo|mtv|bbc|tvb).(org|club|com|net|tv)',
-            '测速类' => '(.*.||)(fast|speedtest).(org|com|net|cn)',
-            '外汇交易类' => '(.*.||)(metatrader4|metatrader5|mql5).(org|com|net)',
-        ];
-
-        foreach ($ruleList as $name => $pattern) {
-            Rule::insert(['type' => 1, 'name' => $name, 'pattern' => $pattern]);
-        }
-
-        // 生成初始管理账号
-        $user = Helpers::addUser('[email protected]', '123456', 100 * GB, sysConfig('default_days'), null, '管理员');
-        $user->update(['status' => 1]);
-        $user->assignRole('Super Admin');
-    }
-}

+ 120 - 0
database/seeders/RBACSeeder.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace Database\Seeders;
+
+use Illuminate\Database\Seeder;
+use Spatie\Permission\Models\Permission;
+use Spatie\Permission\Models\Role;
+
+class RBACSeeder extends Seeder
+{
+    private array $permissions = [
+        'admin.aff.detail' => '【推广系统】提现申请详情',
+        'admin.aff.index' => '【推广系统】提现管理列表',
+        'admin.aff.rebate' => '【推广系统】返利流水记录',
+        'admin.aff.setStatus' => '【推广系统】设置提现状态',
+        'admin.article.create,store' => '【客服系统】新建文章',
+        'admin.article.destroy' => '【客服系统】删除文章',
+        'admin.article.edit,update' => '【客服系统】编辑文章',
+        'admin.article.index,show' => '【客服系统】文章列表',
+        'admin.config.*' => '【设置】通用配置',
+        'admin.coupon.create,store' => '【商品系统】新建卡劵',
+        'admin.coupon.destroy' => '【商品系统】删除卡劵',
+        'admin.coupon.export' => '【商品系统】导出卡劵',
+        'admin.coupon.index' => '【商品系统】卡劵列表',
+        'admin.goods.create,store' => '【商品系统】新建商品',
+        'admin.goods.destroy' => '【商品系统】删除商品',
+        'admin.goods.edit,update' => '【商品系统】编辑商品',
+        'admin.goods.index' => '【商品系统】商品列表',
+        'admin.index' => '【管理中心】首页',
+        'admin.invite.index' => '【推广系统】邀请列表',
+        'admin.invite.create' => '【推广系统】生成邀请码',
+        'admin.invite.export' => '【推广系统】导出邀请码',
+        'admin.log.ban' => '【日志系统】封禁记录',
+        'admin.log.credit' => '【日志系统】余额记录',
+        'admin.log.flow' => '【日志系统】流量变动记录',
+        'admin.log.ip' => '【日志系统】在线IP记录',
+        'admin.log.notify' => '【日志系统】通知记录',
+        'admin.log.online' => '【日志系统】在线监控',
+        'admin.log.traffic' => '【日志系统】流量日志',
+        'log-viewer::dashboard,log-viewer::logs.*' => '【日志系统】运行日志',
+        'admin.marketing.add' => '【客服系统】推送消息',
+        'admin.marketing.email' => '【客服系统】邮件消息列表',
+        'admin.marketing.push' => '【客服系统】推送消息列表',
+        'admin.node.auth.destroy' => '【线路系统】删除授权',
+        'admin.node.auth.index' => '【线路系统】授权列表',
+        'admin.node.auth.store' => '【线路系统】新建授权',
+        'admin.node.auth.update' => '【线路系统】编辑授权',
+        'admin.node.cert.create,store' => '【线路系统】新建证书',
+        'admin.node.cert.destroy' => '【线路系统】删除证书',
+        'admin.node.cert.edit,update' => '【线路系统】编辑证书',
+        'admin.node.cert.index' => '【线路系统】证书列表',
+        'admin.node.check' => '【线路系统】阻断检测',
+        'admin.node.create,store' => '【线路系统】新建线路',
+        'admin.node.destroy' => '【线路系统】删除线路',
+        'admin.node.edit,update' => '【线路系统】编辑线路',
+        'admin.node.geo' => '【线路系统】更新地理',
+        'admin.node.index' => '【线路系统】线路列表',
+        'admin.node.monitor' => '【线路系统】流量监控',
+        'admin.node.ping' => '【线路系统】测速',
+        'admin.node.reload' => '【线路系统】重载',
+        'admin.order' => '【商品系统】订单列表',
+        'admin.payment.callback' => '【日志系统】回调列表',
+        'admin.permission.create,store' => '【权限系统】新建权限',
+        'admin.permission.destroy' => '【权限系统】删除权限',
+        'admin.permission.edit,update' => '【权限系统】编辑权限',
+        'admin.permission.index' => '【权限系统】权限列表',
+        'admin.role.create,store' => '【权限系统】新建角色',
+        'admin.role.destroy' => '【权限系统】删除角色',
+        'admin.role.edit,update' => '【权限系统】编辑角色',
+        'admin.role.index' => '【权限系统】角色列表',
+        'admin.rule.clear' => '【审计规则】清除触发日志',
+        'admin.rule.destroy' => '【审计规则】删除规则',
+        'admin.rule.group.assign,editNode' => '【审计规则】分组关联线路',
+        'admin.rule.group.create,store' => '【审计规则】新建分组',
+        'admin.rule.group.destroy' => '【审计规则】删除分组',
+        'admin.rule.group.edit,update' => '【审计规则】编辑分组',
+        'admin.rule.group.index' => '【审计规则】分组列表',
+        'admin.rule.index' => '【审计规则】规则列表',
+        'admin.rule.log' => '【审计规则】触发日志',
+        'admin.rule.store' => '【审计规则】新建规则',
+        'admin.rule.update' => '【审计规则】编辑规则',
+        'admin.subscribe.index' => '【用户系统】订阅列表',
+        'admin.subscribe.log' => '【用户系统】订阅记录',
+        'admin.subscribe.set' => '【用户系统】编辑订阅状态',
+        'admin.system.index' => '【设置】查看系统设置',
+        'admin.system.update,extend' => '【设置】编辑系统设置',
+        'admin.test.*' => '【设置】通知,支付设置测试',
+        'admin.ticket.destroy' => '【客服系统】删除工单',
+        'admin.ticket.edit,update' => '【客服系统】回复工单',
+        'admin.ticket.index' => '【客服系统】工单列表',
+        'admin.ticket.store' => '【客服系统】新建工单',
+        'admin.tools.*' => '【工具箱】',
+        'admin.user.batch' => '【用户系统】生成用户',
+        'admin.user.create,store' => '【用户系统】新建用户',
+        'admin.user.destroy' => '【用户系统】删除用户',
+        'admin.user.edit,update' => '【用户系统】编辑用户',
+        'admin.user.export' => '【用户系统】配置信息',
+        'admin.user.exportProxy' => '【用户系统】读取配置',
+        'admin.user.group.create,store' => '【用户系统】新建分组',
+        'admin.user.group.destroy' => '【用户系统】删除分组',
+        'admin.user.group.edit,update' => '【用户系统】编辑分组',
+        'admin.user.group.index' => '【用户系统】分组列表',
+        'admin.user.index' => '【用户系统】用户列表',
+        'admin.user.monitor' => '【用户系统】流量统计',
+        'admin.user.online' => '【用户系统】在线巡查',
+        'admin.user.reset' => '【用户系统】流量重置',
+        'admin.user.switch' => '【用户系统】用户视角',
+        'admin.user.updateCredit' => '【用户系统】编辑余额',
+        'give roles' => '【用户系统】赋予角色权限',
+    ];
+
+    public function run(): void
+    {
+        // RBAC
+        Role::create(['name' => 'Super Admin', 'description' => '超级管理员']);
+        foreach ($this->permissions as $name => $description) {
+            Permission::insert(['name' => $name, 'description' => $description, 'guard_name' => 'web']);
+        }
+    }
+}

+ 37 - 0
database/seeders/RuleSeeder.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\Rule;
+use Illuminate\Database\Seeder;
+
+class RuleSeeder extends Seeder
+{
+    private array $rules = [
+        '360' => '(.*.||)(^360|0360|1360|3600|360safe|^so|qhimg|qhmsg|^yunpan|qihoo|qhcdn|qhupdate|360totalsecurity|360shouji|qihucdn|360kan|secmp).(cn|com|net)',
+        '腾讯管家' => '(.guanjia.qq.com|qqpcmgr|QQPCMGR)',
+        '金山毒霸' => '(.*.||)(rising|kingsoft|duba|xindubawukong|jinshanduba).(com|net|org)',
+        '暗网相关' => '(.*.||)(netvigator|torproject).(cn|com|net|org)',
+        '百度定位' => '(api|ps|sv|offnavi|newvector|ulog.imap|newloc|tracknavi)(.map|).(baidu|n.shifen).com',
+        '法轮功类' => '(.*.||)(dafahao|minghui|dongtaiwang|dajiyuan|falundata|shenyun|tuidang|epochweekly|epochtimes|ntdtv|falundafa|wujieliulan|zhengjian).(org|com|net)',
+        'BT扩展名' => '(torrent|.torrent|peer_id=|info_hash|get_peers|find_node|BitTorrent|announce_peer|announce.php?passkey=)',
+        '邮件滥发' => '((^.*@)(guerrillamail|guerrillamailblock|sharklasers|grr|pokemail|spam4|bccto|chacuo|027168).(info|biz|com|de|net|org|me|la)|Subject|HELO|SMTP)',
+        '迅雷下载' => '(.?)(xunlei|sandai|Thunder|XLLiveUD)(.)',
+        '大陆应用' => '(.*.||)(baidu|qq|163|189|10000|10010|10086|sohu|sogoucdn|sogou|uc|58|taobao|qpic|bilibili|hdslb|acgvideo|sina|douban|doubanio|xiaohongshu|sinaimg|weibo|xiaomi|youzanyun|meituan|dianping|biliapi|huawei|pinduoduo|cnzz).(org|com|net|cn)',
+        '大陆银行' => '(.*.||)(icbc|ccb|boc|bankcomm|abchina|cmbchina|psbc|cebbank|cmbc|pingan|spdb|citicbank|cib|hxb|bankofbeijing|hsbank|tccb|4001961200|bosc|hkbchina|njcb|nbcb|lj-bank|bjrcb|jsbchina|gzcb|cqcbank|czbank|hzbank|srcb|cbhb|cqrcb|grcbank|qdccb|bocd|hrbcb|jlbank|bankofdl|qlbchina|dongguanbank|cscb|hebbank|drcbank|zzbank|bsb|xmccb|hljrcc|jxnxs|gsrcu|fjnx|sxnxs|gx966888|gx966888|zj96596|hnnxs|ahrcu|shanxinj|hainanbank|scrcu|gdrcu|hbxh|ynrcc|lnrcc|nmgnxs|hebnx|jlnls|js96008|hnnx|sdnxs).(org|com|net|cn)',
+        '台湾银行' => '(.*.||)(firstbank|bot|cotabank|megabank|tcb-bank|landbank|hncb|bankchb|tbb|ktb|tcbbank|scsb|bop|sunnybank|kgibank|fubon|ctbcbank|cathaybk|eximbank|bok|ubot|feib|yuantabank|sinopac|esunbank|taishinbank|jihsunbank|entiebank|hwataibank|csc|skbank).(org|com|net|tw)',
+        '大陆第三方支付' => '(.*.||)(alipay|baifubao|yeepay|99bill|95516|51credit|cmpay|tenpay|lakala|jdpay).(org|com|net|cn)',
+        '台湾特供' => '(.*.||)(visa|mycard|mastercard|gov|gash|beanfun|bank|line).(org|com|net|cn|tw|jp|kr)',
+        '涉政治类' => '(.*.||)(shenzhoufilm|secretchina|renminbao|aboluowang|mhradio|guangming|zhengwunet|soundofhope|yuanming|zhuichaguoji|fgmtv|xinsheng|shenyunperformingarts|epochweekly|tuidang|shenyun|falundata|bannedbook|pincong|rfi|mingjingnews|boxun|rfa|scmp|ogate|voachinese).(org|com|net|rocks|fr)',
+        '流媒体' => '(.*.||)(youtube|googlevideo|hulu|netflix|nflxvideo|akamai|nflximg|hbo|mtv|bbc|tvb).(org|club|com|net|tv)',
+        '测速类' => '(.*.||)(fast|speedtest).(org|com|net|cn)',
+        '外汇交易类' => '(.*.||)(metatrader4|metatrader5|mql5).(org|com|net)',
+    ];
+
+    public function run(): void
+    { // 审核规则
+        foreach ($this->rules as $name => $pattern) {
+            Rule::insert(['type' => 1, 'name' => $name, 'pattern' => $pattern]);
+        }
+    }
+}

+ 76 - 0
database/seeders/SsConfigSeeder.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace Database\Seeders;
+
+use App\Models\SsConfig;
+use Illuminate\Database\Seeder;
+
+class SsConfigSeeder extends Seeder
+{
+    private array $methodList = [
+        'none',
+        'rc4-md5',
+        'aes-128-cfb',
+        'aes-192-cfb',
+        'aes-256-cfb',
+        'aes-128-ctr',
+        'aes-192-ctr',
+        'aes-256-ctr',
+        'camellia-128-cfb',
+        'camellia-192-cfb',
+        'camellia-256-cfb',
+        'salsa20',
+        'chacha20',
+        'chacha20-ietf',
+        'chacha20-ietf-poly1305',
+        'chacha20-poly1305',
+        'xchacha-ietf-poly1305',
+        'aes-128-gcm',
+        'aes-192-gcm',
+        'aes-256-gcm',
+        'sodium-aes-256-gcm',
+    ];
+
+    private array $protocolList = [
+        'origin',
+        'auth_sha1_v4',
+        'auth_aes128_md5',
+        'auth_aes128_sha1',
+        'auth_chain_a',
+        'auth_chain_b',
+        'auth_chain_c',
+        'auth_chain_d',
+        'auth_chain_e',
+        'auth_chain_f',
+    ];
+
+    private array $obfsList = [
+        'plain',
+        'http_simple',
+        'http_post',
+        'tls1.2_ticket_auth',
+        'tls1.2_ticket_fastauth',
+    ];
+
+    public function run(): void
+    {
+        foreach ($this->methodList as $i => $method) {
+            SsConfig::insert(['name' => $method, 'type' => 1]);
+            if ($i === 0) {
+                SsConfig::type(1)->whereName($method)->first()->setDefault();
+            }
+        }
+        foreach ($this->protocolList as $i => $method) {
+            SsConfig::insert(['name' => $method, 'type' => 2]);
+            if ($i === 0) {
+                SsConfig::type(2)->whereName($method)->first()->setDefault();
+            }
+        }
+        foreach ($this->obfsList as $i => $obs) {
+            SsConfig::insert(['name' => $obs, 'type' => 3]);
+            if ($i === 0) {
+                SsConfig::type(3)->whereName($obs)->first()->setDefault();
+            }
+        }
+    }
+}

Some files were not shown because too many files changed in this diff