wyyl/beike/Admin/Http/Controllers/Controller.php

90 lines
2.6 KiB
PHP

<?php
namespace Beike\Admin\Http\Controllers;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Controller as BaseController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
abstract class Controller extends BaseController
{
protected string $defaultRoute;
/**
* 表单页面获跳转页面链接
* @return mixed
*/
public function getRedirect()
{
if (empty($this->defaultRoute)) {
$this->defaultRoute = $this->getDefaultRoute();
}
return request('_redirect') ?? request()->header('referer', admin_route($this->defaultRoute));
}
/**
* 获取当前管理界面列表页路由
* @return string
*/
private function getDefaultRoute(): string
{
$currentRouteName = Route::getCurrentRoute()->getName();
$names = explode('.', $currentRouteName);
$name = $names[1] ?? '';
return "{$name}.index";
}
/**
* 导出CSV
*
* @param $fileName
* @param $items
* @param string $module
* @return BinaryFileResponse
* @throws \Exception
*/
protected function downloadCsv($fileName, $items, string $module = ''): BinaryFileResponse
{
$module = $module ?: $fileName;
$charset = app()->getLocale() == 'zh-hk' ? 'BIG5' : 'GBK';
if (empty($items)) {
throw new \Exception(trans('empty_items'));
}
if (!str_contains($fileName, '.csv')) {
$fileName = $fileName . '-' . date('YmdHis') . '.csv';
}
$headers = [
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Content-type' => 'application/octet-stream',
// 'Content-type' => 'text/csv',
'Content-Disposition' => "attachment; filename={$fileName}",
'Content-Transfer-Encoding' => 'binary',
'Expires' => '0',
'Pragma' => 'public'
];
$columns = array_keys($items[0]);
foreach ($columns as $index => $column) {
$columns[$index] = iconv("UTF-8", "{$charset}//IGNORE", trans("$module.{$column}"));
}
foreach ($items as $index => $item) {
foreach ($item as $field => $value) {
$items[$index][$field] = iconv("UTF-8", "{$charset}//IGNORE", $value);
}
}
$filePath = storage_path('app/' . $fileName);
$file = fopen($filePath, 'w');
fputcsv($file, $columns);
foreach ($items as $item) {
fputcsv($file, $item);
}
fclose($file);
return response()->download($filePath, $fileName, $headers);
}
}