diff --git a/app/Admin/Controllers/AdController.php b/app/Admin/Controllers/AdController.php index 4b8e442..74287f3 100644 --- a/app/Admin/Controllers/AdController.php +++ b/app/Admin/Controllers/AdController.php @@ -29,22 +29,21 @@ class AdController extends AdminController ...$this->baseHeaderToolBar(), ]) ->filter($this->baseFilter()->labelWidth('80px')->body([ - amis()->TextControl('id', __('admin.ads.id')) - ->size('md') - ->placeholder(__('admin.id')), - amis()->TextControl('remark', __('admin.ads.remark')) - ->size('md') - ->placeholder(__('admin.ads.remark')), - Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=banner_address&has_owner=0'), 'address', __('admin.ads.address'), 'name', 'key') - ->size('md'), - amis()->InputDatetimeRange()->label(__('admin.ads.published_at'))->name('published_at'), - - amis()->SelectControl('enable', __('admin.ads.is_enable')) - ->options([ - 1=>'开启',0=>'关闭' - ]) - ->size('md'), - amis()->InputDatetimeRange()->label(__('admin.created_at'))->name('created_at'), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('id', __('admin.ads.id')) + ->placeholder(__('admin.id')), + amis()->TextControl('remark', __('admin.ads.remark')) + ->placeholder(__('admin.ads.remark')), + Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=banner_address&has_owner=0'), 'address', __('admin.ads.address'), 'name', 'key'), + amis()->SelectControl('enable', __('admin.ads.is_enable')) + ->options([ + 1=>'开启',0=>'关闭' + ]), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->InputDatetimeRange()->label(__('admin.ads.published_at'))->name('published_at'), + amis()->InputDatetimeRange()->label(__('admin.created_at'))->name('created_at'), + ]), ])) ->columns([ amis()->TableColumn('id', __('admin.ads.id'))->width('50px')->sortable(), diff --git a/app/Admin/Controllers/ArticleController.php b/app/Admin/Controllers/ArticleController.php index 860004b..82f46ef 100644 --- a/app/Admin/Controllers/ArticleController.php +++ b/app/Admin/Controllers/ArticleController.php @@ -22,30 +22,31 @@ class ArticleController extends AdminController $this->createButton(), ...$this->baseHeaderToolBar(), ]) - ->filter($this->baseFilter()->labelWidth('80px')->body([ - amis()->TextControl('id', __('admin.articles.id')) - ->size('md') - ->placeholder(__('admin.id')), - amis()->TextControl('title', __('admin.articles.title')) - ->size('md') - ->placeholder(__('admin.articles.title')), - Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=article_category&has_owner=0'), 'category', __('admin.articles.category'), 'name', 'key') - ->size('md'), - amis()->InputDatetimeRange()->label(__('admin.articles.published_at'))->name('published_at'), - - Components::make()->keywordsTagControl('t_ids', __('admin.articles.tags'), 'article_tag') - ->size('md'), - amis()->SelectControl('enable', __('admin.articles.is_enable')) + ->filter($this->baseFilter()->body([ + amis()->GroupControl()->mode('horizontal')->body([ + amis()->TextControl('id', __('admin.articles.id')) + ->placeholder(__('admin.id')), + amis()->TextControl('title', __('admin.articles.title')) + ->placeholder(__('admin.articles.title')), + Components::make()->parentControl(admin_url('api/keywords/tree-list?parent_name=article_category&has_owner=0'), 'category', __('admin.articles.category'), 'name', 'key'), + Components::make()->keywordsTagControl('t_ids', __('admin.articles.tags'), 'article_tag'), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->SelectControl('enable', __('admin.articles.is_enable')) + ->columnRatio(3) ->options([ 1=>'开启',0=>'关闭' - ]) - ->size('md'), - amis()->SelectControl('recommend', __('admin.articles.is_recommend')) + ]), + amis()->SelectControl('recommend', __('admin.articles.is_recommend')) + ->columnRatio(3) ->options([ 1=>'开启',0=>'关闭' - ]) - ->size('md'), - amis()->InputDatetimeRange()->label(__('admin.created_at'))->name('created_at'), + ]), + amis()->InputDatetimeRange()->label(__('admin.articles.published_at'))->name('published_at'), + ]), + amis()->GroupControl()->mode('horizontal')->body([ + amis()->InputDatetimeRange()->label(__('admin.created_at'))->name('created_at')->columnRatio(6), + ]), ])) ->itemBadge([//行角标 'text' => __('admin.articles.is_recommend'), diff --git a/app/Admin/Controllers/SettingController.php b/app/Admin/Controllers/SettingController.php index a574357..9a30057 100644 --- a/app/Admin/Controllers/SettingController.php +++ b/app/Admin/Controllers/SettingController.php @@ -2,6 +2,7 @@ namespace App\Admin\Controllers; +use Illuminate\Support\Arr; use Illuminate\Http\Request; use Slowlyo\OwlAdmin\Renderers\Tab; use Slowlyo\OwlAdmin\Renderers\Tabs; @@ -15,7 +16,6 @@ class SettingController extends AdminController public function index() { $page = $this->basePage()->body([ - Alert::make()->showIcon(true)->body("此处内容仅供演示, 设置项无实际意义,实际开发中请根据实际情况进行修改。"), $this->form(), ]); @@ -25,19 +25,23 @@ class SettingController extends AdminController public function form() { return $this->baseForm(false) - ->redirect('') + ->redirect('')->labelWidth('200px') ->api($this->getStorePath()) ->data(settings()->all()) ->body( Tabs::make()->tabs([ - Tab::make()->title('基本设置')->body([ - TextControl::make()->label('网站名称')->name('site_name'), - InputKV::make()->label('附加配置')->name('addition_config'), - ]), Tab::make()->title('上传设置')->body([ - TextControl::make()->label('上传域名')->name('upload_domain'), - TextControl::make()->label('上传路径')->name('upload_path'), - ]), + amis()->RadiosControl('upload_disk', '上传驱动')->options([ + 'public'=>'本地存储', + 'oss' => '阿里云OSS', + ])->value('public')->required(true), + amis()->TextControl('oss_config.access_key_id', '阿里云AccessKeyId')->required(true)->size('lg')->visibleOn('${upload_disk == "oss"}'), + amis()->TextControl('oss_config.access_key_secret', '阿里云AccessKeySecret')->required(true)->size('lg')->visibleOn('${upload_disk == "oss"}'), + amis()->TextControl('oss_config.bucket', '对象存储Bucket')->required(true)->size('lg')->visibleOn('${upload_disk == "oss"}')->remark('示例: my-bucket'), + amis()->TextControl('oss_config.endpoint', '对象存储endpoint')->required(true)->size('lg')->visibleOn('${upload_disk == "oss"}')->remark('示例: oss-cn-shanghai.aliyuncs.com'), + amis()->TextControl('oss_config.domain', '自有域名')->size('lg')->visibleOn('${upload_disk == "oss"}')->remark('填写即启用 示例: my-domain.com'), + amis()->SwitchControl('oss_config.use_ssl', '开启SSL')->value(false)->visibleOn('${upload_disk == "oss"}'), + ]), ]) ); } @@ -45,12 +49,43 @@ class SettingController extends AdminController public function store(Request $request) { $data = $request->only([ - 'site_name', - 'addition_config', - 'upload_domain', - 'upload_path', + 'upload_disk', + 'oss_config' ]); + //上传设置-修改env文件内配置; + if(!empty($data['upload_disk'])){ + $envData['FILESYSTEM_DISK'] = $data['upload_disk']; + if($envData['FILESYSTEM_DISK'] == 'oss'){//如果设置为OSS驱动,则配置env变量 + $envData['OSS_ACCESS_KEY_ID'] = Arr::get($data['oss_config'], 'access_key_id'); + $envData['OSS_ACCESS_KEY_SECRET'] = Arr::get($data['oss_config'], 'access_key_secret'); + $envData['OSS_BUCKET'] = Arr::get($data['oss_config'], 'bucket'); + $envData['OSS_ENDPOINT'] = Arr::get($data['oss_config'], 'endpoint'); + $envData['OSS_DOMAIN'] = Arr::get($data['oss_config'], 'domain'); + if(!empty($envData['OSS_DOMAIN'])){ + $envData['OSS_CNAME'] = 'true'; + }else{ + $envData['OSS_CNAME'] = 'false'; + } + $envData['OSS_SSL'] = Arr::get($data['oss_config'], 'use_ssl') ? 'true':'false'; + } + $envPath = base_path() . DIRECTORY_SEPARATOR . '.env'; + $contentArray = collect(file($envPath, FILE_IGNORE_NEW_LINES)); + $contentArray->transform(function ($item) use ($envData){ + foreach ($envData as $key => $value){ + if(str_contains($item, $key)){ + + return $key . '=' . $value; + } + } + return $item; + }); + + $content = implode("\n", $contentArray->toArray()); + \File::put($envPath, $content); + } + + return settings()->adminSetMany($data); } } diff --git a/composer.json b/composer.json index 8bd2706..7b0e439 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "license": "MIT", "require": { "php": "^8.1", + "alphasnow/aliyun-oss-laravel": "^4.7", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^10.10", "laravel/sanctum": "^3.3", diff --git a/composer.lock b/composer.lock index 879a81d..f38d4f9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,143 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec2cedc62465f8a6d60ba0b0f78581dd", + "content-hash": "b2333ae7a977ba073ff6ef0f01f5de43", "packages": [ + { + "name": "aliyuncs/oss-sdk-php", + "version": "v2.6.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/aliyuncs/oss-sdk-php/v2.6.0/aliyuncs-oss-sdk-php-v2.6.0.zip", + "reference": "572d0f8e099e8630ae7139ed3fdedb926c7a760f", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "*", + "satooshi/php-coveralls": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "OSS\\": "src/OSS" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aliyuncs", + "homepage": "http://www.aliyun.com" + } + ], + "description": "Aliyun OSS SDK for PHP", + "homepage": "http://www.aliyun.com/product/oss/", + "time": "2022-08-03T08:06:01+00:00" + }, + { + "name": "alphasnow/aliyun-oss-flysystem", + "version": "3.3.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/alphasnow/aliyun-oss-flysystem/3.3.3/alphasnow-aliyun-oss-flysystem-3.3.3.zip", + "reference": "ac62f862cb743ca76f7c3c146ffdd8d52af86153", + "shasum": "" + }, + "require": { + "aliyuncs/oss-sdk-php": "^2.5", + "league/flysystem": "^3.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.6", + "mockery/mockery": "^1.5", + "php-coveralls/php-coveralls": "*", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "vlucas/phpdotenv": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "AlphaSnow\\Flysystem\\Aliyun\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alpha Snow", + "email": "wind91@foxmail.com" + } + ], + "description": "Flysystem adapter for the Aliyun storage", + "homepage": "https://alphasnow.github.io/aliyun-oss-flysystem/", + "keywords": [ + "adapter", + "aliyun", + "filesystem", + "oss" + ], + "time": "2023-06-29T08:45:24+00:00" + }, + { + "name": "alphasnow/aliyun-oss-laravel", + "version": "4.7.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/alphasnow/aliyun-oss-laravel/4.7.1/alphasnow-aliyun-oss-laravel-4.7.1.zip", + "reference": "d4f5885bcff8c7a5c43be118e749a85fe5eb6a99", + "shasum": "" + }, + "require": { + "alphasnow/aliyun-oss-flysystem": "^3.3", + "php": "^8.0.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.12", + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.13", + "php-coveralls/php-coveralls": "*", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "AlphaSnow\\LaravelFilesystem\\Aliyun\\AliyunServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "AlphaSnow\\LaravelFilesystem\\Aliyun\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "alphasnow", + "email": "wind91@foxmail.com" + } + ], + "description": "alibaba cloud object storage service for laravel", + "homepage": "https://alphasnow.github.io/aliyun-oss-laravel/", + "keywords": [ + "aliyun", + "filesystems", + "laravel", + "oss", + "storage" + ], + "time": "2022-12-03T14:27:07+00:00" + }, { "name": "brick/math", "version": "0.11.0", diff --git a/config/admin.php b/config/admin.php index 54b0f3e..7c6dd40 100644 --- a/config/admin.php +++ b/config/admin.php @@ -54,7 +54,7 @@ return [ ], 'upload' => [ - 'disk' => 'public', + 'disk' => env("FILESYSTEM_DISK", 'public'), // 文件上传目录 'directory' => [ 'image' => 'images', diff --git a/config/filesystems.php b/config/filesystems.php index e9d9dbd..6ba861d 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -56,6 +56,22 @@ return [ 'throw' => false, ], + "oss" => [ + "driver" => "oss", + "access_key_id" => env("OSS_ACCESS_KEY_ID"), // 必填, 阿里云的AccessKeyId + "access_key_secret" => env("OSS_ACCESS_KEY_SECRET"), // 必填, 阿里云的AccessKeySecret + "bucket" => env("OSS_BUCKET"), // 必填, 对象存储的Bucket, 示例: my-bucket + "endpoint" => env("OSS_ENDPOINT"), // 必填, 对象存储的Endpoint, 示例: oss-cn-shanghai.aliyuncs.com + "internal" => env("OSS_INTERNAL", null), // 选填, 内网上传地址,填写即启用 示例: oss-cn-shanghai-internal.aliyuncs.com + "domain" => env("OSS_DOMAIN", null), // 选填, 绑定域名,填写即启用 示例: oss.my-domain.com + "is_cname" => env("OSS_CNAME", false), // 选填, 若Endpoint为自定义域名,此项要为true,见:https://github.com/aliyun/aliyun-oss-php-sdk/blob/572d0f8e099e8630ae7139ed3fdedb926c7a760f/src/OSS/OssClient.php#L113C1-L122C78 + "prefix" => env("OSS_PREFIX", ""), // 选填, 统一存储地址前缀 + "use_ssl" => env("OSS_SSL", false), // 选填, 是否使用HTTPS + "reverse_proxy" => env("OSS_REVERSE_PROXY", false), // 选填, 域名是否使用NGINX代理绑定 + "throw" => env("OSS_THROW", true), // 选填, 是否抛出引起错误的异常,默认出现错误时,不抛出异常仅返回false + "options" => [], // 选填, 添加全局配置参数, 示例: [\OSS\OssClient::OSS_CHECK_MD5 => false] + "macros" => [] // 选填, 添加自定义Macro, 示例: [\App\Macros\ListBuckets::class, \App\Macros\CreateBucket::class] + ], ], /*