Bladeren bron

feat:dist添加产品分类修改

igb 5 maanden geleden
bovenliggende
commit
e8f220ab06

+ 28 - 41
app/Distributor/Controllers/DistProductCategoryController.php

@@ -3,6 +3,7 @@
 namespace App\Distributor\Controllers;
 
 use App\Distributor\Repositories\DistProductCategory;
+use App\Distributor\Repositories\DistProductCategoryB;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -20,8 +21,7 @@ class DistProductCategoryController extends AdminController
         return $content
             ->view('distributor.layouts.content')
             ->header(admin_trans('admin.proudct_category'))
-            ->description(admin_trans('admin.all'))
-            ->breadcrumb(['text'=>'list','url'=>''])
+            ->description('')
             ->body($this->grid());
     }
 
@@ -68,40 +68,25 @@ class DistProductCategoryController extends AdminController
     protected function grid()
     {
         return Grid::make(new DistProductCategory(), function (Grid $grid) {
-            $grid->column('id')->sortable();
-            $grid->column('name');
+            $grid->column('id','ID')->bold();//->sortable();
+            $grid->column('name')->display(function ($name) {
+                return html_entity_decode($name); // 或者直接返回 $name,如果你确定不需要转义
+            });
             $grid->column('parent_id');
-            $grid->column('order');
-            $grid->column('enabled');
-            $grid->column('parameter_id');
+            $grid->column('distProductParameter.name',admin_trans_label('parameter_name'));
+            $grid->column('order')->orderable();
+            $grid->column('enabled')->switch();
             $grid->column('created_at');
             $grid->column('updated_at')->sortable();
+//            $grid->filter(function (Grid\Filter $filter) {
+//                $filter->like('name');
+//            });
+            $grid->disableViewButton();
+            $grid->showQuickEditButton();
+            $grid->enableDialogCreate();
+            $grid->disableEditButton();
 
-            $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id');
-
-            });
-        });
-    }
-
-    /**
-     * Make a show builder.
-     *
-     * @param mixed $id
-     *
-     * @return Show
-     */
-    protected function detail($id)
-    {
-        return Show::make($id, new DistProductCategory(), function (Show $show) {
-            $show->field('id');
-            $show->field('name');
-            $show->field('parent_id');
-            $show->field('order');
-            $show->field('enabled');
-            $show->field('parameter_id');
-            $show->field('created_at');
-            $show->field('updated_at');
+            //$grid->quickSearch('name');
         });
     }
 
@@ -113,15 +98,17 @@ class DistProductCategoryController extends AdminController
     protected function form()
     {
         return Form::make(new DistProductCategory(), function (Form $form) {
-            $form->display('id');
-            $form->text('name');
-            $form->text('parent_id');
-            $form->text('order');
-            $form->text('enabled');
-            $form->text('parameter_id');
-
-            $form->display('created_at');
-            $form->display('updated_at');
+            $form->display('id', 'ID');
+            $form->select('parent_id', admin_trans_field('parent'))
+                ->options(DistProductCategory::selectOptions())
+                ->saving(function ($v) {
+                    return (int) $v;
+                });
+            $form->text('name')->required();
+          //  $form->select('parameter_id', 'parameter')->options(DistProductParameter::selectOptions())->required();// DIST不需要绑定 parameter
+            $form->switch('enabled')->default(1);
+          //  $form->display('created_at');
+          //  $form->display('updated_at');
         });
     }
 }

+ 115 - 37
app/Distributor/Controllers/DistProductController.php

@@ -2,14 +2,19 @@
 
 namespace App\Distributor\Controllers;
 
-use App\Distributor\Repositories\DistProduct;
+
+use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
 use Dcat\Admin\Http\Controllers\AdminController;
-use Dcat\Admin\Layout\Content;
-use Dcat\Admin\Admin;
 
+use App\Distributor\Repositories\DistProduct;
+use App\Distributor\Repositories\DistProductCategory;
+use App\Distributor\Repositories\DistProductImage;
+
+use Illuminate\Http\Request;
+use App\Libraries\CommonHelper;
 class DistProductController extends AdminController
 {
     /**
@@ -21,7 +26,8 @@ class DistProductController extends AdminController
             ->view('distributor.layouts.content')
             ->header(admin_trans( 'admin.products_list'))
             ->description(admin_trans('admin.all'))
-            ->breadcrumb(['text'=>'list','url'=>''])
+            ->description('all')
+            ->breadcrumb(['text'=>'Product Management','url'=>''])
             ->body($this->grid());
     }
 
@@ -64,27 +70,33 @@ class DistProductController extends AdminController
      */
     protected function grid()
     {
-        return Grid::make(new DistProduct(), function (Grid $grid) {
-            $grid->column('id')->sortable();
+        return Grid::make(DistProduct::with(['distProductCategory','images']), function (Grid $grid) {
+            $grid->column('id','ID')->sortable();
             $grid->column('title');
-            $grid->column('keywords');
-            $grid->column('description');
             $grid->column('sku');
-            $grid->column('category_id');
+            $grid->column('dist_product_category.name',admin_trans_label('category_name'));
             $grid->column('issuance_date');
-            $grid->column('order');
-            $grid->column('enabled');
-            $grid->column('content');
-            $grid->column('parameters');
-            $grid->column('is_pinned');
+            $grid->column('images')->display(function ($images) {
+                $images = $images->toArray();
+                $dataImages = array_column($images, 'image_url');
+                return CommonHelper::displayImage($dataImages,150);
+            });
+            $grid->column('order')->orderable();
+            $grid->column('is_pinned')->switch();
+            $grid->column('enabled')->switch();
             $grid->column('created_at');
             $grid->column('updated_at')->sortable();
-
+            // 筛选
             $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id');
-
+                $filter->equal('sku');
+                $filter->like('title');
+                $filter->equal('category_id','Category')->select(DistProductCategory::selectOptions());
+                $filter->equal('enabled', 'enabled')->select(config('dictionary.enabled'));
             });
+            //排序
+            $grid->model()->orderBy("is_pinned",'desc')->orderBy("order",'desc');
         });
+
     }
 
     /**
@@ -96,21 +108,41 @@ class DistProductController extends AdminController
      */
     protected function detail($id)
     {
-        return Show::make($id, new DistProduct(), function (Show $show) {
+        return Show::make($id, DistProduct::with(['distProductCategory','images']), function (Show $show) {
             $show->field('id');
             $show->field('title');
             $show->field('keywords');
             $show->field('description');
             $show->field('sku');
-            $show->field('category_id');
+            $show->field('dist_product_category.name','Category Name');
             $show->field('issuance_date');
-            $show->field('order');
-            $show->field('enabled');
+            $show->field('parameters')->as(function ($items) {
+                if (is_array($items)) {
+                    // 创建表格的表头
+                    $table = '<table class="table">';
+                    $table .= '<tr><th>key</th><th>value</th></tr>';
+                    // 遍历数组并将数据填充到表格中
+                    foreach ($items as $item) {
+                        $table .= '<tr>';
+                        $table .= '<td>' . $item['key'] . '</td>';    // 商品名称
+                        $table .= '<td>' . $item['value'] . '</td>'; // 数量
+                        $table .= '</tr>';
+                    }
+                    $table .= '</table>';
+                    return $table;
+                }
+                return ''; // 当没有数组数据时
+            })->unescape();
+            $show->field('images')->as(function ($images) {
+                // 开始生成 HTML
+                $dataImages = array_column($images, 'image_url');
+                return CommonHelper::displayImage($dataImages,150);
+            })->unescape();
             $show->field('content');
-            $show->field('parameters');
-            $show->field('is_pinned');
             $show->field('created_at');
             $show->field('updated_at');
+            $show->field('order');
+            $show->field('enabled')->using(config('dictionary.enabled'));
         });
     }
 
@@ -121,22 +153,68 @@ class DistProductController extends AdminController
      */
     protected function form()
     {
-        return Form::make(new DistProduct(), function (Form $form) {
+        return Form::make(DistProduct::with('images'), function (Form $form) {
             $form->display('id');
-            $form->text('title');
+            $form->select('category_id', 'Category Name')
+                ->options(BaseProductCategory::selectOptions())
+                ->required();
+            $form->text('title')->required();
             $form->text('keywords');
-            $form->text('description');
-            $form->text('sku');
-            $form->text('category_id');
-            $form->text('issuance_date');
-            $form->text('order');
-            $form->text('enabled');
-            $form->text('content');
-            $form->text('parameters');
-            $form->text('is_pinned');
-
-            $form->display('created_at');
-            $form->display('updated_at');
+            $form->textarea('description');
+            $form->text('sku')->required();
+            $form->date('issuance_date');
+            $form->table('parameters','Parameters', function (Form\NestedForm $table) {
+                $table->text('key')->required();
+                $table->text('value')->required();
+            });
+            // 多图上传
+            $form->multipleImage('images', 'images')
+                ->sortable() // 可拖动排序
+                ->removable() // 可移除图片
+                ->autoUpload() // 自动上传
+                ->uniqueName()
+                ->accept(config('distributor.upload.oss_image.accept'))
+                ->maxSize(config('distributor.upload.oss_image.max_size'))
+                ->dir('dist_images/product/'.date("Ymd"))
+                ->customFormat(function () {
+                    // 数据格式化为数组['1.jpg','2.jpg'] 编辑时用到
+                    return array_column($this->images, 'image_url');
+                })
+                ->saving(function ($images) {
+                    return array_map(function($image) {
+                        return ['image_url' => $image];
+                    }, $images);
+                });
+            $form->editor('content');
+            $form->switch('is_pinned')->default(0);
+            $form->switch('enabled')->default(1);
+            //插入JS
+            $this->addParametersJs();
         });
     }
+
+    /*
+     * 以json型式返回产品参数
+     */
+    public static function parameter(Request $request)
+    {
+        $id = $request->query('q');
+        $content = BaseProductCategory::getParameter($id);
+        return $content;
+    }
+    /**
+     * 分类与参数联动JS
+     * @return void
+     */
+    private function addParametersJs()
+    {
+        $prefix = config('admin.route.prefix');
+        //插入JS
+        Admin::script(
+            <<<JS
+
+
+JS
+        );
+    }
 }

+ 131 - 0
app/Distributor/Repositories/DistProductCategory.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace App\Distributor\Repositories;
+
+use App\Models\DistProductCategory as Model;
+
+use App\Models\DistProductParameter;
+use Dcat\Admin\Repositories\EloquentRepository;
+
+class DistProductCategory extends EloquentRepository
+{
+    /**
+     * Model.
+     *
+     * @var string
+     */
+    protected $eloquentClass = Model::class;
+
+
+    // 调用模型方法
+    public static function selectOptions(\Closure $closure = null)
+    {
+        $selectOptions = Model::class::selectOptions($closure);
+
+// 用于存储结果
+        $headings = [];
+
+// 遍历数组,提取以 ├─ 开头的部分
+        foreach ($selectOptions as $key => $value) {
+            // 检查字符串是否以 ├─ 开头
+            if (strpos($value, '├─') === 0 || strpos($value, '└─') === 0) {
+
+                // 保存结果
+                $headings[$key] = $value;
+            }
+        }
+
+        return $headings;
+//        $query = Model::query();
+//
+//        if ($closure) {
+//            $closure($query);
+//        }
+//
+//        // 确保查询构造器不为空
+//        if (!$query) {
+//            return [];
+//        }
+//
+//        // 返回键值对数组
+//        return $query->orderBy('name')->pluck('name', 'id')->all();
+
+    }
+
+
+    public static function getParameter($categoryId)
+    {
+        $categoryRow =  Model::Class::find($categoryId);
+        if ($categoryRow->baseProductParameter) {
+            return $categoryRow->baseProductParameter->content;
+        } else {
+            return "[]";
+        }
+    }
+
+    public function get(Grid\Model|\Dcat\Admin\Grid\Model $model)
+    {
+        $obj = new Model();
+
+        // 将树结构转换为数组
+        $tree = $obj->toTree();
+        $data=[];
+
+        foreach ($tree as $key => $value)
+        {
+            $node = $value->toArray();
+
+
+            if(isset($node['children']))
+            {
+                $clone_node= $node;
+                unset($clone_node['children']);
+                $data[] = $clone_node;
+
+                $sub_data=$this->flattenTree($node['children']); // 递归扁平化子节点
+
+                //var_dump($sub_data);
+                $data = array_merge($data, $sub_data);
+            }
+            else
+            {
+                $data[] = $node;
+
+           }
+        }
+
+
+
+        return $model->makePaginator(
+            1, // 传入总记录数
+            $data // 传入数据二维数组
+        );
+    }
+
+
+    function flattenTree(array $nodes, $level = 1)
+    {
+        $flat = [];
+
+        foreach ($nodes as $node) {
+            // 创建一个副本并转换为数组
+            $node = $node->toArray();
+            $nodeCopy = $node;
+            unset($nodeCopy['children']);
+
+            // 根据层级在 name 字段前添加空格
+            $nodeCopy['name'] = str_repeat('&nbsp; ', $level * 2). ' <i class="fa fa-angle-right"></i>&nbsp; ' . $nodeCopy['name'];
+
+
+            // 将去除 'children' 属性的节点添加到平坦数组中
+            $flat[] = $nodeCopy;
+
+            // 如果存在子节点,则递归处理子节点
+            if (isset($node['children']) && is_array($node['children'])) {
+                $flat = array_merge($flat, $this->flattenTree($node['children'], $level + 1));
+            }
+        }
+
+        return $flat;
+    }
+}