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 @@ {{ __('currency.symbol_right') }} {{ __('currency.decimal_place') }} {{ __('currency.value') }} + {{ __('currency.latest_value') }} {{ __('common.status') }} {{ __('common.action') }} @@ -32,6 +33,7 @@ @{{ language.symbol_right }} @{{ language.decimal_place }} @{{ language.value }} + @{{ language.latest_value }} {{ __('common.enable') }} {{ __('common.disable') }} diff --git a/resources/lang/de/currency.php b/resources/lang/de/currency.php index 6417e05d..3cf429c6 100644 --- a/resources/lang/de/currency.php +++ b/resources/lang/de/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => 'rechtes Symbol', 'value' => 'Wechselkurswert', 'decimal_place' => 'Nachkommastellen', + 'latest_value' => 'letzten Wechselkurswert', ]; diff --git a/resources/lang/en/currency.php b/resources/lang/en/currency.php index 9cd32fd0..87b64331 100644 --- a/resources/lang/en/currency.php +++ b/resources/lang/en/currency.php @@ -18,4 +18,5 @@ return [ 'symbol_right' => 'Symbol Right', 'value' => 'Value', 'decimal_place' => 'Decimal Place', + 'latest_value' => 'Latest Value', ]; diff --git a/resources/lang/es/currency.php b/resources/lang/es/currency.php index 9ee748bc..5e130ce4 100644 --- a/resources/lang/es/currency.php +++ b/resources/lang/es/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => 'signo correcto', 'value' => 'valor del tipo de cambio', 'decimal_place' => 'lugares decimales', + 'latest_value' => 'último valor del tipo de cambio', ]; diff --git a/resources/lang/fr/currency.php b/resources/lang/fr/currency.php index e3beb6c2..654bcd2a 100644 --- a/resources/lang/fr/currency.php +++ b/resources/lang/fr/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => 'bon signe', 'value' => 'valeur du taux de change', 'decimal_place' => 'décimales', + 'latest_value' => 'dernière valeur du taux de change', ]; diff --git a/resources/lang/it/currency.php b/resources/lang/it/currency.php index 8031befa..bd8a80ab 100644 --- a/resources/lang/it/currency.php +++ b/resources/lang/it/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => 'segno giusto', 'value' => 'valore del tasso di cambio', 'decimal_place' => 'decimali', + 'latest_value' => 'ultimo valore del tasso di cambio', ]; diff --git a/resources/lang/ja/currency.php b/resources/lang/ja/currency.php index ba29d5f4..b05e32a0 100644 --- a/resources/lang/ja/currency.php +++ b/resources/lang/ja/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => '右記号', 'value' => '為替レート値', 'decimal_place' => '小数位', + 'latest_value' => '最新の為替レート値', ]; diff --git a/resources/lang/ru/currency.php b/resources/lang/ru/currency.php index 963fa57d..bea1ac0e 100644 --- a/resources/lang/ru/currency.php +++ b/resources/lang/ru/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => 'правильный символ', 'value' => 'Стоимость обменного курса', 'decimal_place' => 'Десятичные разряды', + 'latest_value' => 'последнее значение обменного курса', ]; diff --git a/resources/lang/zh_cn/currency.php b/resources/lang/zh_cn/currency.php index a66a6025..22a33d46 100644 --- a/resources/lang/zh_cn/currency.php +++ b/resources/lang/zh_cn/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => '右符号', 'value' => '汇率值', 'decimal_place' => '小数位数', + 'latest_value' => '最新汇率值', ]; diff --git a/resources/lang/zh_hk/currency.php b/resources/lang/zh_hk/currency.php index 4e16ce34..9cb8e8b2 100644 --- a/resources/lang/zh_hk/currency.php +++ b/resources/lang/zh_hk/currency.php @@ -19,4 +19,5 @@ return [ 'symbol_right' => '右符號', 'value' => '匯率值', 'decimal_place' => '小數位數', + 'latest_value' => '最新匯率值', ];