diff --git a/.env.example b/.env.example index 4f0e496c..bc1788f7 100644 --- a/.env.example +++ b/.env.example @@ -60,3 +60,6 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" # 前端热更新, PROXY: vhost or path, HOST: 多设备实时 MIX_PROXY=beikeshop.test MIX_HOST=192.168.0.122 + +# 自动获取最新汇率API KEY +RATE_KEY= diff --git a/beike/Admin/Providers/AdminServiceProvider.php b/beike/Admin/Providers/AdminServiceProvider.php index 5218a5e0..8d6e26b7 100644 --- a/beike/Admin/Providers/AdminServiceProvider.php +++ b/beike/Admin/Providers/AdminServiceProvider.php @@ -28,6 +28,7 @@ use Beike\Console\Commands\GenerateDatabaseDict; use Beike\Console\Commands\GenerateSitemap; use Beike\Console\Commands\MakeRootAdminUser; use Beike\Console\Commands\MigrateFromOpenCart; +use Beike\Console\Commands\FetchCurrencyRate; use Beike\Models\AdminUser; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\View; @@ -90,6 +91,7 @@ class AdminServiceProvider extends ServiceProvider GenerateSitemap::class, MakeRootAdminUser::class, MigrateFromOpenCart::class, + FetchCurrencyRate::class, ]); } } diff --git a/beike/Config/beike.php b/beike/Config/beike.php index 98116119..42eb3270 100644 --- a/beike/Config/beike.php +++ b/beike/Config/beike.php @@ -16,4 +16,5 @@ return [ 'admin_name' => env('ADMIN_NAME'), 'force_url_https' => env('APP_FORCE_HTTPS', false), + 'rate_key' => env('RATE_KEY') ]; diff --git a/beike/Console/Commands/FetchCurrencyRate.php b/beike/Console/Commands/FetchCurrencyRate.php new file mode 100644 index 00000000..9d59edd5 --- /dev/null +++ b/beike/Console/Commands/FetchCurrencyRate.php @@ -0,0 +1,37 @@ +info(sprintf('获取 %s 汇率数据开始', $today)); + + try { + $tableRows = []; + $data = CurrencyService::getInstance()->getRatesFromApi($today); + + foreach ($data as $key => $val) { + $tableRows[] = [$key, $val]; + } + + $this->table(['货币', '汇率'], $tableRows); + + $this->info(sprintf('获取 %s 汇率数据完成', $today)); + }catch (\Exception) { + $this->error(sprintf('获取 %s 汇率数据失败', $today)); + } + } + + +} diff --git a/beike/Models/Currency.php b/beike/Models/Currency.php index 3ac2392b..529ddefc 100644 --- a/beike/Models/Currency.php +++ b/beike/Models/Currency.php @@ -11,6 +11,7 @@ namespace Beike\Models; +use Beike\Services\CurrencyService; use Illuminate\Database\Eloquent\Factories\HasFactory; class Currency extends Base @@ -18,4 +19,20 @@ class Currency extends Base use HasFactory; protected $fillable = ['name', 'code', 'symbol_left', 'symbol_right', 'decimal_place', 'value', 'status']; + + protected $appends = ['latest_value']; + + public function getLatestValueAttribute() + { + try { + $today = date('Y-m-d'); + $data = CurrencyService::getInstance()->getRatesFromApi($today); + + return $data[$this->code] ?? $this->value; + } catch (\Exception) { + return $this->value; + } + } + + } diff --git a/beike/Services/CurrencyService.php b/beike/Services/CurrencyService.php index 4d848543..1615791e 100644 --- a/beike/Services/CurrencyService.php +++ b/beike/Services/CurrencyService.php @@ -12,6 +12,7 @@ namespace Beike\Services; use Beike\Repositories\CurrencyRepo; +use Illuminate\Support\Facades\Http; class CurrencyService { @@ -91,4 +92,18 @@ class CurrencyService return $value * ($to / $from); } + + public function getRatesFromApi(string $date) + { + $cacheKey = 'currency:rates:' . $date; + if ($rates = cache()->get($cacheKey)) { + return $rates; + } + $data = Http::get(sprintf('https://v6.exchangerate-api.com/v6/%s/latest/USD', config('beike.rate_key'))) + ->json(); + $rates = $data['conversion_rates'] ?? []; + cache()->set($cacheKey, $rates); + + return $rates; + } } diff --git a/resources/beike/admin/views/pages/currencies/index.blade.php b/resources/beike/admin/views/pages/currencies/index.blade.php index 7d7b1938..22b35c89 100644 --- a/resources/beike/admin/views/pages/currencies/index.blade.php +++ b/resources/beike/admin/views/pages/currencies/index.blade.php @@ -19,6 +19,7 @@