diff --git a/serve/app/Console/Commands/SystemInit.php b/serve/app/Console/Commands/SystemInit.php index 4178ee7..65acfcd 100755 --- a/serve/app/Console/Commands/SystemInit.php +++ b/serve/app/Console/Commands/SystemInit.php @@ -52,6 +52,26 @@ class SystemInit extends Command private function config_data(): array { return [ + [ + 'slug' => 'web_site_title', + 'value' => '蚂蚁快链-智慧引流工具', + 'desc' => '网站名称', + ], + [ + 'slug' => 'web_site_logo', + 'value' => '/image/toplogo.png', + 'desc' => '网站logo浅色', + ], + [ + 'slug' => 'web_site_bottom_logo', + 'value' => '/image/toplogo.png', + 'desc' => '网站logo深色', + ], + [ + 'slug' => 'web_site_customer_service', + 'value' => '/image/web-qr.png', + 'desc' => '客服二维码', + ], [ 'slug' => 'is_give_vip', 'value' => 1, diff --git a/serve/app/Forms/PaymentSet.php b/serve/app/Forms/PaymentSet.php new file mode 100644 index 0000000..61950fa --- /dev/null +++ b/serve/app/Forms/PaymentSet.php @@ -0,0 +1,38 @@ +validate([ + 'wechat_pay_app_id' => 'nullable', + 'wechat_pay_mch_id' => 'nullable', + 'wechat_pay_secret_key' => 'nullable', + 'wechat_pay_private_cert' => 'nullable', + 'wechat_pay_certificate' => 'nullable', + ]); + } + + // 保存 + public function handle(array $input): void + { + SystemConfig::set($input); + } + + public function default(): array + { + return [ + 'wechat_pay_app_id' => SystemConfig::get('wechat_pay_app_id'), + 'wechat_pay_mch_id' => SystemConfig::get('wechat_pay_mch_id'), + 'wechat_pay_secret_key' => SystemConfig::get('wechat_pay_secret_key'), + 'wechat_pay_private_cert' => SystemConfig::get('wechat_pay_secret_key'), // 私钥证书 + 'wechat_pay_certificate' => SystemConfig::get('wechat_pay_certificate'), // 公钥证书 + ]; + } +} diff --git a/serve/app/Forms/VerifyCode.php b/serve/app/Forms/VerifyCode.php new file mode 100644 index 0000000..9c8b558 --- /dev/null +++ b/serve/app/Forms/VerifyCode.php @@ -0,0 +1,53 @@ +validate([ + 'verify_code_is_open' => 'nullable|boolen', + 'send_code_mode' => 'nullable', + 'ali_sms_key' => 'nullable', + 'ali_sms_secret' => 'nullable', + 'ali_sms_sign_name' => 'nullable', + + 'mail_from_name' => 'nullable', + 'mail_host' => 'nullable', + 'mail_port' => 'nullable', + 'mail_from_address' => 'nullable', + 'mail_username' => 'nullable', + 'mail_password' => 'nullable', + ]); + } + + // 保存 + public function handle(array $input): void + { + SystemConfig::set($input); + } + + public function default(): array + { + return [ + 'verify_code_is_open' => SystemConfig::get('verify_code_is_open'), // 开启 + 'send_code_mode' => SystemConfig::get('send_code_mode'), // + + 'ali_sms_key' => SystemConfig::get('ali_sms_key'), + 'ali_sms_secret' => SystemConfig::get('ali_sms_secret'), + 'ali_sms_sign_name' => SystemConfig::get('ali_sms_sign_name'), + + 'mail_from_name' => SystemConfig::get('mail_from_name'), + 'mail_host' => SystemConfig::get('mail_host'), + 'mail_port' => SystemConfig::get('mail_port'), + 'mail_from_address' => SystemConfig::get('mail_from_address'), + 'mail_username' => SystemConfig::get('mail_username'), + 'mail_password' => SystemConfig::get('mail_password'), + ]; + } +} diff --git a/serve/app/Forms/WebSite.php b/serve/app/Forms/WebSite.php new file mode 100644 index 0000000..e259b64 --- /dev/null +++ b/serve/app/Forms/WebSite.php @@ -0,0 +1,36 @@ +validate([ + 'web_site_customer_service' => 'nullable', + 'web_site_title' => 'nullable', + 'web_site_logo' => 'nullable', + 'web_site_bottom_logo' => 'nullable', + ]); + } + + // 保存 + public function handle(array $input): void + { + SystemConfig::set($input); + } + + public function default(): array + { + return [ + 'web_site_customer_service' => SystemConfig::get('web_site_customer_service'), + 'web_site_title' => SystemConfig::get('web_site_title'), + 'web_site_logo' => SystemConfig::get('web_site_logo'), + 'web_site_bottom_logo' => SystemConfig::get('web_site_bottom_logo'), + ]; + } +} diff --git a/serve/app/Http/Controllers/Api/ConfigController.php b/serve/app/Http/Controllers/Api/ConfigController.php index 3486ec5..d8ee380 100644 --- a/serve/app/Http/Controllers/Api/ConfigController.php +++ b/serve/app/Http/Controllers/Api/ConfigController.php @@ -3,11 +3,17 @@ namespace App\Http\Controllers\Api; use App\Forms\BaseConfig; +use App\Forms\PaymentSet; +use App\Forms\VerifyCode; +use App\Forms\WebSite; use Ugly\Base\Http\Controllers\SimpleFormController; class ConfigController extends SimpleFormController { protected array $form = [ 'base' => BaseConfig::class, + 'web_site' => WebSite::class, + 'payment' => PaymentSet::class, + 'verify_code' => VerifyCode::class, ]; } diff --git a/serve/app/Http/Controllers/Api/IndexController.php b/serve/app/Http/Controllers/Api/IndexController.php index a4bc038..d1c43b7 100644 --- a/serve/app/Http/Controllers/Api/IndexController.php +++ b/serve/app/Http/Controllers/Api/IndexController.php @@ -114,19 +114,22 @@ class IndexController extends Controller $configs = [ 'code_mode' => SystemConfig::get('send_code_mode'), 'package' => VipPackage::query()->orderBy('level')->get(['id', 'name', 'price', 'config']), + 'web_site_customer_service' => SystemConfig::get('web_site_customer_service'), + 'web_site_title' => SystemConfig::get('web_site_title'), + 'web_site_logo' => SystemConfig::get('web_site_logo'), + 'web_site_bottom_logo' => SystemConfig::get('web_site_bottom_logo'), + 'asset_url' => Storage::url(''), // 图片路径 ]; $user = auth('api')->user(); if ($user) { - // 图片路径 - $configs['asset_url'] = Storage::url(''); // 安全域名 // $configs['domains'] = Domain::query()->where('enable', true)->get(['id', 'title']); // 小程序 (区分是否有权限使用平台小程序池) $configs['mini_programs'] = MiniProgram::query() ->where( - fn($query) => $query->where('user_id', $user->id) - ->when($user->getPackageConfig('pre_min'), fn($query) => $query->orWhere('is_pre_min', true)) + fn ($query) => $query->where('user_id', $user->id) + ->when($user->getPackageConfig('pre_min'), fn ($query) => $query->orWhere('is_pre_min', true)) ) ->get(['id', 'name']); } diff --git a/serve/app/Http/Requests/LoginRequest.php b/serve/app/Http/Requests/LoginRequest.php index a5ff87d..9b58bbc 100644 --- a/serve/app/Http/Requests/LoginRequest.php +++ b/serve/app/Http/Requests/LoginRequest.php @@ -23,17 +23,26 @@ class LoginRequest extends FormRequest */ public function rules(): array { - $code_mode = SystemConfig::get('send_code_mode'); - $rule = $code_mode == CodeMode::Email->value ? 'email' : 'regex:/^1[3-9]\d{9}$/'; - - return [ + $rules = [ 'username' => [ 'required', - 'exclude_if:username,admin', - $rule, + 'exists:users,username', ], 'password' => 'required|min:6', ]; + $is_open = SystemConfig::get('verify_code_is_open'); + if ($is_open) { + $code_mode = SystemConfig::get('send_code_mode'); + $rule = $code_mode == CodeMode::Email->value ? 'email' : 'regex:/^1[3-9]\d{9}$/'; + + $rules['username'] = [ + 'required', + 'exists:users,username', + $rule, + ]; + } + + return $rules; } public function messages(): array diff --git a/serve/app/Http/Requests/RegisterRequest.php b/serve/app/Http/Requests/RegisterRequest.php index 93bf6e0..11e8c3c 100644 --- a/serve/app/Http/Requests/RegisterRequest.php +++ b/serve/app/Http/Requests/RegisterRequest.php @@ -24,33 +24,50 @@ class RegisterRequest extends FormRequest */ public function rules(): array { - $code_mode = SystemConfig::get('send_code_mode'); - $rule = $code_mode == CodeMode::Email->value ? 'email' : 'regex:/^1[3-9]\d{9}$/'; + $is_open = SystemConfig::get('verify_code_is_open'); + if ($is_open) { + $code_mode = SystemConfig::get('send_code_mode'); + $rule = ($code_mode == CodeMode::Email->value) ? 'email' : 'regex:/^1[3-9]\d{9}$/'; + + return [ + 'username' => [ + 'required', + $rule, + 'unique:users,username', + ], + 'password' => 'required|min:6|confirmed', + 'captcha' => ['required', function (string $attribute, mixed $value, \Closure $fail) { + $test_code = config('services.ali_sms.test_code'); + if (empty($test_code) || $value != $test_code) { + $tel = $this->input('username'); + $captcha = Cache::get('sms_captcha_'.$tel); + if ((int) $captcha !== (int) $value) { + $fail('验证码错误!'); + } + } + }], + 'referral_code' => '', // 推荐码 + ]; + } return [ 'username' => [ 'required', - $rule, 'unique:users,username', ], 'password' => 'required|min:6|confirmed', - 'captcha' => ['required', function (string $attribute, mixed $value, \Closure $fail) { - $test_code = config('services.ali_sms.test_code'); - if (empty($test_code) || $value != $test_code) { - $tel = $this->input('username'); - $captcha = Cache::get('sms_captcha_'.$tel); - if ((int) $captcha !== (int) $value) { - $fail('验证码错误!'); - } - } - }], 'referral_code' => '', // 推荐码 ]; } public function messages(): array { - $txt = CodeMode::Email->value ? '邮箱' : '手机号'; + $code_mode = SystemConfig::get('send_code_mode'); + $is_open = SystemConfig::get('verify_code_is_open'); + $txt = '用户名'; + if (! empty($is_open)) { + $txt = ($code_mode === CodeMode::Email->value) ? '邮箱' : '手机号'; + } return [ 'username.required' => "请输入{$txt}!", diff --git a/serve/app/Jobs/SendEmailJobs.php b/serve/app/Jobs/SendEmailJobs.php index 90bd989..5460422 100644 --- a/serve/app/Jobs/SendEmailJobs.php +++ b/serve/app/Jobs/SendEmailJobs.php @@ -4,11 +4,13 @@ namespace App\Jobs; use App\Jobs\Middleware\RateLimited; use App\Mail\SendEmail; +use App\Services\SystemConfig; 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\Config; use Illuminate\Support\Facades\Mail; use Throwable; @@ -31,6 +33,13 @@ class SendEmailJobs implements ShouldQueue $this->to = $to; $this->code = $code; $this->title = $title ?? '邮箱验证码'; + + Config::set('mail.mailers.smtp.host', SystemConfig::get('mail_host')); + Config::set('mail.mailers.smtp.port', SystemConfig::get('mail_port')); + Config::set('mail.mailers.smtp.username', SystemConfig::get('mail_username')); + Config::set('mail.mailers.smtp.password', SystemConfig::get('mail_password')); + Config::set('mail.from.address', SystemConfig::get('mail_from_address')); + Config::set('mail.from.name', SystemConfig::get('mail_from_name')); } public function middleware() diff --git a/serve/app/PayChannels/WeChatPayNative.php b/serve/app/PayChannels/WeChatPayNative.php index 0853d1f..c419743 100644 --- a/serve/app/PayChannels/WeChatPayNative.php +++ b/serve/app/PayChannels/WeChatPayNative.php @@ -2,6 +2,7 @@ namespace App\PayChannels; +use App\Services\SystemConfig; use EasyWeChat\Pay\Application; use Illuminate\Support\Carbon; use Symfony\Component\HttpFoundation\Response; @@ -17,7 +18,21 @@ class WeChatPayNative public function __construct() { - $this->payApp = new Application(config('services.wechat_pay')); + $config = [ + 'appid' => SystemConfig::get('wechat_pay_app_id'), + 'mch_id' => SystemConfig::get('wechat_pay_mch_id'), + 'secret_key' => SystemConfig::get('wechat_pay_secret_key'), + // 商户证书 + 'private_key' => SystemConfig::get('wechat_pay_secret_key'), + 'certificate' => SystemConfig::get('wechat_pay_certificate'), + /*'platform_certs' => [ + storage_path('/certs/wechatpay.pem'), + ],*/ + 'http' => [ + 'throw' => false, + ], + ]; + $this->payApp = new Application($config); } // 支付 diff --git a/serve/app/Services/AliDySms.php b/serve/app/Services/AliDySms.php index 3bdf7b0..37de745 100644 --- a/serve/app/Services/AliDySms.php +++ b/serve/app/Services/AliDySms.php @@ -17,7 +17,13 @@ class AliDySms public function __construct() { - $this->config = config('services.ali_sms'); + $config = [ + 'key' => SystemConfig::get('ali_sms_key'), + 'secret' => SystemConfig::get('ali_sms_secret'), + 'sign_name' => SystemConfig::get('ali_sms_sign_name'), + 'test_code' => env('ALI_SMS_TEST_CODE'), + ]; + $this->config = $config; } /** diff --git a/serve/resources/views/welcome.blade.php b/serve/resources/views/welcome.blade.php index aa5c15a..a34e624 100644 --- a/serve/resources/views/welcome.blade.php +++ b/serve/resources/views/welcome.blade.php @@ -6,7 +6,7 @@ - 火星快链-智慧引流工具 + {!! \App\Services\SystemConfig::get('web_site_title') !!}