Browse Source

RPC调用相册系统

moshaorui 2 months ago
parent
commit
ee83f62fc2

+ 11 - 3
app/Admin/Controllers/DistAdminDistributorController.php

@@ -6,6 +6,7 @@ use App\Admin\Actions\Grid\InitAppearance;
 use App\Admin\Repositories\BaseIso3166;
 use App\Admin\Repositories\DistAdminDistributor;
 use App\Admin\Repositories\DistAppearance;
+use App\Admin\Repositories\RpcAlbumFolder;
 use App\Libraries\CommonHelper;
 use App\Models\DistProductCategory;
 use Dcat\Admin\Form;
@@ -68,6 +69,7 @@ class DistAdminDistributorController extends AdminController
             $grid->enableDialogCreate();
             $grid->disableEditButton();
             $grid->disableDeleteButton();
+            $grid->disableViewButton();
             //批量操作
             $grid->batchActions(function (Grid\Tools\BatchActions $batch) {
                 $batch->disableDelete();
@@ -108,14 +110,20 @@ class DistAdminDistributorController extends AdminController
      */
     protected function form()
     {
-        return Form::make(new DistAdminDistributor(), function (Form $form) {
+        $allNodes = RpcAlbumFolder::allNodes();
+        return Form::make(new DistAdminDistributor(), function (Form $form) use ($allNodes) {
             $form->text('client_code',admin_trans_label('client_code'))->width(9,3)->required();
-            $form->text('dist_email',admin_trans_label('email'))->width(9,3);
-            $form->text('dist_contact_number',admin_trans_label('contact_number'))->width(9,3);
             $form->select('country')
                 ->options(BaseIso3166::selectOptions())
                 ->width(9,3)->required();
             $form->text('country_lang')->width(9,3)->required()->help(admin_trans_label('country_lang_tips'));
+            $form->tree('album_folder',admin_trans_label('album_folder'))
+                ->setTitleColumn('title')
+                ->nodes($allNodes)
+                ->exceptParentNode(false)
+                ->width(9,3);
+            $form->text('dist_email',admin_trans_label('email'))->width(9,3);
+            $form->text('dist_contact_number',admin_trans_label('contact_number'))->width(9,3);
             $form->text('address')->width(9,3);
             $form->switch('enabled')->width(9,3)->default(1);
             $form->hidden('country_alpha_2');

+ 19 - 2
app/Admin/Controllers/ImportProductController.php

@@ -19,6 +19,11 @@ use Dcat\Admin\Show;
 
 class ImportProductController extends AdminController
 {
+    public function title()
+    {
+        return admin_trans( 'admin.product_import');
+    }
+
     /**
      * page index
      */
@@ -150,12 +155,24 @@ class ImportProductController extends AdminController
 
             $show->field('en_detail')->as(function ($images) {
                 $images = json_decode($images);
-                return CommonHelper::displayImage($images,150);
+                $html = '<div style="text-align: center">';
+                foreach ($images as $key => $image) {
+                    $url = CommonHelper::ossUrl($image);
+                    $html .= '<img src="' . $url . '" style="max-width:90%;margin-bottom:10px">';
+                }
+                $html .= '</div>';
+                return $html;
             })->unescape();
 
             $show->field('cn_detail')->as(function ($images) {
                 $images = json_decode($images);
-                return CommonHelper::displayImage($images,150);
+                $html = '<div style="text-align: center">';
+                foreach ($images as $key => $image) {
+                    $url = CommonHelper::ossUrl($image);
+                    $html .= '<img src="' . $url . '" style="max-width:90%;margin-bottom:10px">';
+                }
+                $html .= '</div>';
+                return $html;
             })->unescape();
 
             $show->field('video')->as(function ($items) {

+ 2 - 1
app/Admin/Repositories/RpcAlbum.php

@@ -21,12 +21,12 @@ class RpcAlbum extends EloquentRepository
      */
     protected $eloquentClass = Model::class;
 
+
     public function execute($method, $params = [])
     {
         return RpcClient::albumExecute($method, $params);
     }
 
-
     /*
      * 通过IDS获取相册详情
      */
@@ -62,6 +62,7 @@ class RpcAlbum extends EloquentRepository
             'page' => $currentPage,
         ]);
 
+
         $data = $result['data'] ?? [];
 
         return $model->makePaginator(

+ 11 - 5
app/Admin/Repositories/RpcAlbumFolder.php

@@ -28,16 +28,22 @@ class RpcAlbumFolder extends EloquentRepository
 
     /*
      * 获取相册文件夹列表
+     * $inIds 传入的相册ID数组,为空时获取全部相册
      */
     public static function selectOptions() {
         $self = new self();
-        $result = $self->execute('siteAlbumFolderSelectOptions', []);
+        $result = $self->execute('siteAlbumFolderSelectOptionsAll', []);
         $data = $result['data'] ?? [];
         return $data;
     }
 
-
-
-
-
+    /*
+     * 获取相册文件夹树
+     */
+    public static function allNodes() {
+        $self = new self();
+        $result = $self->execute('siteAlbumFolderAllNodes', []);
+        $data = $result['data'] ?? [];
+        return $data;
+    }
 }

+ 193 - 0
app/Distributor/Controllers/SiteAlbumController.php

@@ -0,0 +1,193 @@
+<?php
+
+namespace App\Distributor\Controllers;
+
+
+use App\Admin\Actions\Grid\RpcAlbumImport;
+use App\Admin\Forms\RpcAlbumImportForm;
+use App\Distributor\Repositories\RpcAlbum;
+use App\Distributor\Repositories\RpcAlbumFolder;
+use App\Distributor\Repositories\DistAdminDistributor;
+use App\Libraries\CommonHelper;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Http\Controllers\AdminController;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Show;
+
+class SiteAlbumController extends AdminController
+{
+    public function title()
+    {
+        return admin_trans( 'admin.promotional_materials');
+    }
+
+    /**
+     * page index
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header(admin_trans( 'admin.promotional_materials'))
+            ->breadcrumb(['text'=>'list','url'=>''])
+            ->body($this->grid());
+    }
+
+
+
+    //屏蔽删除
+    public function destroy($id)
+    {
+        abort(404);
+    }
+
+    //屏蔽创建
+    public function create(Content $content)
+    {
+        abort(404);
+    }
+
+    //屏蔽编辑
+    public function edit($id, Content $content)
+    {
+        abort(404);
+    }
+
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        //相册分类
+        $rpcAlbumFolder = RpcAlbumFolder::selectOptions();
+        return Grid::make(new RpcAlbum(), function (Grid $grid) use ($rpcAlbumFolder) {
+            $grid->view('admin.grid.table');
+            $grid->column('id')->display(function () {
+                return $this->_index+1;
+            });
+            $grid->column('cover')->display(function ($images) {
+                $images = json_decode($images);
+                // 限制最多显示2个缩略图
+                $dataImages = array_slice($images, 0, 1);
+                return CommonHelper::displayImage($dataImages,100);
+            });
+            $grid->column('title');
+            $grid->column('model');
+            $grid->column('updated_at')->sortable();
+            // 筛选
+            $grid->filter(function (Grid\Filter $filter) use ($rpcAlbumFolder) {
+                $filter->panel();
+                $filter->expand();
+                $filter->equal('model')->width(2);
+                $filter->equal('folder_id',admin_trans_label('product_category'))->select($rpcAlbumFolder)->width(2);
+            });
+            // 删除新增按钮
+            $grid->disableCreateButton();
+            $grid->disableEditButton();
+            $grid->disableDeleteButton();
+            $grid->disableBatchDelete();
+            // 添加批量复制操作
+            $grid->batchActions(function ($batch) {
+                //$batch->add(new BatchCopy()); 只能2选1
+            });
+            $grid->model()->where('enabled',1)->orderBy("order",'desc')->orderBy("created_at",'desc');
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new RpcAlbum(), function (Show $show) {
+            $show->field('title');
+            $show->field('model');
+            $show->field('parameters',admin_trans_label('attribute'))->as(function ($items) {
+                $items = json_decode($items);
+                if (is_array($items)) {
+                    // 创建表格的表头
+                    $table = '<table class="table table-bordered table-condensed">';
+                    // 遍历数组并将数据填充到表格中
+                    foreach ($items as $item) {
+                        $item = (array)$item;
+                        $table .= '<tr>';
+                        $table .= '<td style="vertical-align: middle !important;width: 20%">' . $item['key'] . '</td>';    // 商品名称
+                        $table .= '<td style="vertical-align: middle !important;">' . $item['value'] . '</td>'; // 数量
+                        $table .= '</tr>';
+                    }
+                    $table .= '</table>';
+                    return $table;
+                }
+                return ''; // 当没有数组数据时
+            })->unescape();
+
+            $show->field('cover')->as(function ($images) {
+                $images = json_decode($images);
+                return CommonHelper::displayImage($images,150);
+            })->unescape();
+
+            $show->field('en_detail')->as(function ($images) {
+                $images = json_decode($images);
+                $html = '<div style="text-align: center">';
+                foreach ($images as $key => $image) {
+                    $url = CommonHelper::ossUrl($image);
+                    $html .= '<img src="' . $url . '" style="max-width:90%;margin-bottom:10px">';
+                }
+                $html .= '</div>';
+                return $html;
+            })->unescape();
+
+            $show->field('video')->as(function ($items) {
+                $items = json_decode($items);
+                return CommonHelper::displayVideo($items,'cover','video_src','150');
+            })->unescape();
+
+            $show->field('poster')->as(function ($images) {
+                $images = json_decode($images);
+                return CommonHelper::displayImage($images,150);
+            })->unescape();
+
+            $show->field('cert')->as(function ($images) {
+                $images = json_decode($images);
+                return CommonHelper::displayImage($images,150);
+            })->unescape();
+
+            $show->field('cert')->as(function ($images) {
+                $images = json_decode($images);
+                return CommonHelper::displayImage($images,150);
+            })->unescape();
+
+            $show->field('pdf')->as(function ($items) {
+                $items = json_decode($items);
+                if (is_array($items)) {
+                    // 创建表格的表头
+                    $table = '<table class="table table-bordered table-condensed">';
+                    // 遍历数组并将数据填充到表格中
+                    foreach ($items as $item) {
+                        $table .= '<tr>';
+                        $table .= '<td style="vertical-align: middle !important;width: 20%">' . $item->pdf_title . '</td>';    // 商品名称
+                        $table .= '<td style="vertical-align: middle !important;"><a target="_blank" href="' . CommonHelper::ossUrl($item->pdf_src). '">查看</a></td>'; // 数量
+                        $table .= '</tr>';
+                    }
+                    $table .= '</table>';
+                    return $table;
+                }
+                return ''; // 当没有数组数据时
+            })->unescape();
+
+            // 禁用操作
+            $show->disableEditButton();
+            $show->disableDeleteButton();
+        });
+    }
+
+
+
+
+}

+ 96 - 0
app/Distributor/Repositories/RpcAlbum.php

@@ -0,0 +1,96 @@
+<?php
+
+namespace App\Distributor\Repositories;
+
+use App\Libraries\RpcClient;
+use App\Models\NullModel as Model;
+use Dcat\Admin\Form;
+use Dcat\Admin\Repositories\EloquentRepository;
+use Dcat\Admin\Show;
+use JsonRPC\Client;
+
+/*
+ * RPC调用相册
+ */
+class RpcAlbum extends EloquentRepository
+{
+    /**
+     * Model.
+     *
+     * @var string
+     */
+    protected $eloquentClass = Model::class;
+
+    public $albumFolder = [];
+
+    public function __construct($modelOrRelations = [])
+    {
+        $this->initModel($modelOrRelations);
+        $distInfo = DistAdminDistributor::getInfo();
+        $albumFolder = empty($distInfo->album_folder) ? [] : json_decode($distInfo->album_folder);
+        $this->albumFolder = $albumFolder;
+    }
+
+    /*
+     * 执行RPC调用
+     */
+    public function execute($method, $params = [])
+    {
+        return RpcClient::albumExecute($method, $params);
+    }
+
+    /*
+     * 获取相册列表
+     */
+    public function get(Grid\Model|\Dcat\Admin\Grid\Model $model)
+    {
+        $self = new self();
+        // 获取当前页数
+        $currentPage = $model->getCurrentPage();
+        // 获取每页显示行数
+        $perPage = $model->getPerPage();
+
+        // 获取筛选参数
+        $filterModel = $model->filter()->input('model', '');
+        $folder_id = $model->filter()->input('folder_id', '');
+
+        $filter = [
+            'model' => $filterModel,
+            'folder_id' => $folder_id,
+            'album_folder' => $self->albumFolder,
+        ];
+
+        $result = $this->execute('siteAlbumPaginate', [
+            'filter' => $filter,
+            'perPage'=>$perPage,
+            'page' => $currentPage,
+        ]);
+
+
+
+
+        $data = $result['data'] ?? [];
+
+        return $model->makePaginator(
+          $data['total'] ?? 0,
+           $data['data'] ?? [] // 传入数据二维数组
+        );
+    }
+
+
+    /*
+     * 获取相册详情
+     */
+    public function detail(Show $show): array
+    {
+        // 获取数据主键值
+        $id = $show->getKey();
+        $result = $this->execute('siteAlbumGet', [
+            'id' => $id,
+        ]);
+        $data = $result['data'] ?? [];
+        return $data;
+    }
+
+
+}

+ 53 - 0
app/Distributor/Repositories/RpcAlbumFolder.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Distributor\Repositories;
+
+use App\Libraries\RpcClient;
+use App\Models\NullModel as Model;
+use Dcat\Admin\Repositories\EloquentRepository;
+use Dcat\Admin\Show;
+
+/*
+ * RPC调用相册
+ */
+
+class RpcAlbumFolder extends EloquentRepository
+{
+    /**
+     * Model.
+     *
+     * @var string
+     */
+    protected $eloquentClass = Model::class;
+
+    public $albumFolder = [];
+
+    public function __construct($modelOrRelations = [])
+    {
+        $this->initModel($modelOrRelations);
+        $distInfo = DistAdminDistributor::getInfo();
+        $albumFolder = empty($distInfo->album_folder) ? [] : json_decode($distInfo->album_folder,true);
+
+        $this->albumFolder = $albumFolder;
+    }
+
+    /*
+     * RPC调用
+     */
+    public function execute($method, $params = [])
+    {
+        return RpcClient::albumExecute($method, $params);
+    }
+
+    /*
+     * 获取相册文件夹列表
+     * $inIds 传入的相册ID数组,为空时获取全部相册
+     */
+    public static function selectOptions() {
+        $self = new self();
+        $inIds = $self->albumFolder;
+        $result = $self->execute('siteAlbumFolderSelectOptions', ['inIds' => $inIds]);
+        $data = $result['data'] ?? [];
+        return $data;
+    }
+}

+ 4 - 0
app/Distributor/routes.php

@@ -73,6 +73,10 @@ Route::group([
     $router->post('visual-editor/upload', 'VisualEditorController@upload');
     $router->post('visual-editor/preview-save', 'VisualEditorController@previewSave');
     $router->post('visual-editor/publish', 'VisualEditorController@publish');
+    //宣传资料
+    $router->get('site-album', 'SiteAlbumController@index');
+    $router->get('site-album/{id}', 'SiteAlbumController@show');
+
 });
 
 /*

+ 3 - 3
app/Libraries/RpcClient.php

@@ -11,7 +11,7 @@ use JsonRPC\HttpClient;
 class RpcClient
 {
     // RPC超时时间
-    public static $timeout = 3;
+    public static $timeout = 5;
 
     /*
      * RPC客户端
@@ -27,7 +27,7 @@ class RpcClient
         $clientHost = env('ALBUM_RPC_URL');
         $httpClient = new HttpClient($clientHost);
         $httpClient = $httpClient->withTimeout(self::$timeout);
-        $client = new Client($clientHost,true,$httpClient);
+        $client = new Client($clientHost,false,$httpClient);
         try {
             $result = $client->execute( $procedure, $params,[], null,[
                     'X-API-Key: '.$apiKey,
@@ -35,7 +35,7 @@ class RpcClient
             ]);
             return $result;
         } catch (\Exception $e) {
-            throw new \Exception($e->getMessage());
+            return ['status'=>false,'msg'=>$e->getMessage(),'data'=>[]];
         }
     }
 

+ 31 - 0
database/migrations/2025_01_10_085440_update_dist_admin_distributor_table.php

@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        //
+        Schema::table('dist_admin_distributor', function (Blueprint $table) {
+            $table->string('album_folder',1000);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+};

+ 1 - 0
lang/en/admin.php

@@ -258,4 +258,5 @@ return [
     'inquiry_list' => 'Inquiry List',
     'banner_list' => 'Banner List',
     'crop_the_image' => 'Crop the Image',
+    'promotional_materials' => 'Promotional Materials',
 ];

+ 1 - 0
lang/en/global.php

@@ -201,6 +201,7 @@ return [
         'visual_edit'           => 'Visual Edit',
         'top_menu'              => 'Top Menu',
         'bottom_menu'           => 'Bottom Menu',
+        'album_folder'          => 'Album Folder',
     ],
     'options' => [
         //

+ 2 - 1
lang/zh_CN/admin.php

@@ -258,5 +258,6 @@ return [
     'banner_list' => '轮播图列表',
     'landing_page' => '独立页',
     'messages' => '消息',
-    'crop_the_image' => '裁剪图片'
+    'crop_the_image' => '裁剪图片',
+    'promotional_materials' => '宣传资料',
 ];

+ 1 - 0
lang/zh_CN/global.php

@@ -210,6 +210,7 @@ return [
         'visual_edit'           => '可视化编辑',
         'top_menu'              => '顶部菜单',
         'bottom_menu'           => '底部菜单',
+        'album_folder'          => '相册分类',
     ],
     'options' => [
         //

+ 1 - 0
lang/zh_CN/menu.php

@@ -53,5 +53,6 @@ return [
         'landing_page' => '独立页',
         'messages' => '消息',
         'banner'  =>'轮播图',
+        'promotional_materials'  =>'宣传资料',
     ],
 ];