diff --git a/README.md b/README.md index 05f3af5..c190517 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ Fork From [jqhph/dcat-admin](https://github.com/jqhph/dcat-admin) +## 安装 + +- `composer config repositories.peidikeji/dcat-admin git git@gitee.com:paddy_technology/dcat-admin.git` +- `composer require peidikeji/dcat-admin` + ## 改动 - 文件: `dcat-admin/src/Form/Footer.php`, 将 `reset` 按钮默认设置为 `false` diff --git a/packages/goods/goods-attr.json b/packages/goods/goods-attr.json new file mode 100644 index 0000000..58d19d7 --- /dev/null +++ b/packages/goods/goods-attr.json @@ -0,0 +1,74 @@ +[ + { + "table": "goods-type.spec", + "name": "颜色", + "values": [ + "白色", + "红色", + "蓝色" + ] + }, + { + "table": "goods-type.attr", + "name": "主体", + "values": [ + "入网型号", + "上市年份" + ] + }, + { + "table": "goods-type.part", + "name": "套餐", + "values": [ + "套餐1", + "套餐2" + ] + }, + { + "table": "goods.attr", + "name": "主体", + "values": [ + { "name": "入网型号", "value": "5G" }, + { "name": "上市年份", "value": "2020" } + ] + }, + { + "table": "goods.spec", + "name": "颜色", + "values": [ + { "name": "白色", "price": 0 }, + { "name": "红色", "price": 0 }, + { "name": "蓝色", "price": 1 } + ] + }, + { + "table": "goods.part", + "name": "套餐", + "values": [ + { "name": "套餐1", "price": 150 }, + { "name": "套餐2", "price": 100 } + ] + }, + { + "table": "goods-sku.attr", + "name": "主体", + "values": [ + { "name": "入网型号", "value": "5G" }, + { "name": "上市年份", "value": "2020" } + ] + }, + { + "table": "goods-sku.spec", + "name": "颜色", + "value": "白色", + "price": 0 + }, + { + "table": "goods-sku.part", + "name": "颜色", + "values": [ + { "name": "套餐1", "price": 150 }, + { "name": "套餐2", "price": 100 } + ] + } +] diff --git a/packages/goods/resources/assets/goods.css b/packages/goods/resources/assets/goods.css new file mode 100644 index 0000000..95218e7 --- /dev/null +++ b/packages/goods/resources/assets/goods.css @@ -0,0 +1,12 @@ +.grid-attr .group:not(:first-child) { + margin-top: 10px; +} +.grid-attr .group-item { + display: inline-block;vertical-align: top; +} +.grid-attr .group-title { + min-width: 80px +} +.grid-attr .group-value:not(:first-child) { + margin-top: 10px; +} diff --git a/packages/goods/resources/views/form/attr.blade.php b/packages/goods/resources/views/form/attr.blade.php new file mode 100644 index 0000000..b2f3482 --- /dev/null +++ b/packages/goods/resources/views/form/attr.blade.php @@ -0,0 +1,227 @@ +
+ + + + + @foreach($headers as $item) + + @endforeach + + + + + @foreach($value as $index => $item) + + + + @foreach($item['values'] as $subItem) + + + + + @endforeach + + + + + @endforeach + + + + + +
{{ $item }}
{{ $item['name'] }}
{{ $subItem }} + +
+ + + +
+ + + +
+
+ + diff --git a/packages/goods/resources/views/goods-type/grid-attr.blade.php b/packages/goods/resources/views/goods-type/grid-attr.blade.php new file mode 100644 index 0000000..7dc24bb --- /dev/null +++ b/packages/goods/resources/views/goods-type/grid-attr.blade.php @@ -0,0 +1,21 @@ + + + +@if($value) +
+ @foreach($value as $item) +
+
+ {{ $item['name'] }} +
+
+ @foreach($item['values'] as $subItem) +
+ {{ $subItem }} +
+ @endforeach +
+
+ @endforeach +
+@endif diff --git a/packages/goods/src/Form/Attr.php b/packages/goods/src/Form/Attr.php new file mode 100644 index 0000000..4caa4ce --- /dev/null +++ b/packages/goods/src/Form/Attr.php @@ -0,0 +1,42 @@ + [], + 'keys' => [], + 'type' => null + ]; + + public function header(array $headers) + { + $this->addVariables([ + 'headers' => $headers, + ]); + + return $this; + } + + public function keys($keys) + { + $this->addVariables([ + 'keys' => $keys, + ]); + + return $this; + } + + public function type($type) + { + $this->addVariables(['type' => $type]); + + return $this; + } +} diff --git a/packages/goods/src/Form/GoodsType/AttrForm.php b/packages/goods/src/Form/GoodsType/AttrForm.php new file mode 100644 index 0000000..35be5e1 --- /dev/null +++ b/packages/goods/src/Form/GoodsType/AttrForm.php @@ -0,0 +1,36 @@ +payload['type_id']); + $info->update(['attr' => json_decode($input['attr'])]); + + return $this->response()->success('保存成功'); + } + + public function form() + { + $this->fill(['attr' => $this->payload['attr']]); + + $this->attr('attr')->header(['分组', '名称'])->keys(['name']); + + $reset = data_get($this->payload, 'reset', true); + $this->resetButton(!!$reset); + } + + protected function renderResetButton() + { + return (! empty($this->buttons['reset'])) ? " 返回" : ''; + } +} diff --git a/packages/goods/src/Form/GoodsType/SpecForm.php b/packages/goods/src/Form/GoodsType/SpecForm.php new file mode 100644 index 0000000..9b7fcdd --- /dev/null +++ b/packages/goods/src/Form/GoodsType/SpecForm.php @@ -0,0 +1,36 @@ +payload['type_id']); + $info->update(['spec' => json_decode($input['spec'])]); + + return $this->response()->success('保存成功'); + } + + public function form() + { + $this->fill(['spec' => $this->payload['spec']]); + + $this->attr('spec')->header(['名称', '可选值'])->keys(['name']); + + $reset = data_get($this->payload, 'reset', true); + $this->resetButton(!!$reset); + } + + protected function renderResetButton() + { + return (! empty($this->buttons['reset'])) ? " 返回" : ''; + } +} diff --git a/packages/goods/src/GoodsServiceProvider.php b/packages/goods/src/GoodsServiceProvider.php index c1e6b29..42525c7 100644 --- a/packages/goods/src/GoodsServiceProvider.php +++ b/packages/goods/src/GoodsServiceProvider.php @@ -5,10 +5,14 @@ namespace Peidikeji\Goods; use Dcat\Admin\Extend\ServiceProvider; use Dcat\Admin\Admin; use Dcat\Admin\Form; +use Peidikeji\Goods\Form\Attr; use Peidikeji\Goods\Form\Spec; class GoodsServiceProvider extends ServiceProvider { + protected $css = [ + 'goods.css' + ]; protected $menu = [ ['title' => '商品管理', 'uri' => '', 'icon' => ''], ['title' => '商品分类', 'uri' => 'goods/category', 'icon' => '', 'parent' => '商品管理'], @@ -21,5 +25,8 @@ class GoodsServiceProvider extends ServiceProvider { parent::init(); Form::extend('spec', Spec::class); + Form::extend('attr', Attr::class); + + Admin::requireAssets(['@peidikeji.dcat-admin-extension-goods']); } } diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php index 0d46b74..77db092 100644 --- a/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php +++ b/packages/goods/src/Http/Controllers/Admin/GoodsSkuController.php @@ -43,7 +43,7 @@ class GoodsSkuController extends Controller $grid->column('id'); $grid->column('sn'); $grid->column('name'); - $grid->column('origin_price')->display(fn() => $goods->price); + // $grid->column('reset')->display(fn() => $goods->price); $grid->column('price'); $grid->column('stock'); if ($goods->spec) { diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php b/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php index 950b5c4..5adee37 100644 --- a/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php +++ b/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php @@ -3,9 +3,11 @@ namespace Peidikeji\Goods\Http\Controllers\Admin; use Dcat\Admin\Form; -use Dcat\Admin\Form\NestedForm; use Dcat\Admin\Grid; +use Dcat\Admin\Grid\Displayers\Modal; use Dcat\Admin\Http\Controllers\AdminController; +use Peidikeji\Goods\Form\GoodsType\AttrForm; +use Peidikeji\Goods\Form\GoodsType\SpecForm; use Peidikeji\Goods\Models\Goods; use Peidikeji\Goods\Models\GoodsType; @@ -18,32 +20,30 @@ class GoodsTypeController extends AdminController return Grid::make(new GoodsType(), function (Grid $grid) { $grid->disableRowSelector(); $grid->disableViewButton(); + $grid->disableEditButton(); - $grid->column('name'); - $grid->column('attr')->view('peidikeji.dcat-admin-extension-goods::grid.part'); - $grid->column('spec')->view('peidikeji.dcat-admin-extension-goods::grid.part'); - $grid->column('part')->view('peidikeji.dcat-admin-extension-goods::grid.part'); + $grid->column('name')->editable(); + $grid->column('attr')->display(fn() => view('peidikeji.dcat-admin-extension-goods::goods-type.grid-attr', ['value' => $this->attr]))->modal(__('peidikeji.dcat-admin-extension-goods::goods-type.fields.attr'), function (Modal $modal) { + $modal->icon(''); + return AttrForm::make()->payload(['type_id' => $this->id, 'reset' => false, 'attr' => $this->attr]); + }); + $grid->column('spec')->display(fn() => view('peidikeji.dcat-admin-extension-goods::goods-type.grid-attr', ['value' => $this->spec]))->modal(__('peidikeji.dcat-admin-extension-goods::goods-type.fields.spec'), function (Modal $modal) { + $modal->icon(''); + return SpecForm::make()->payload(['type_id' => $this->id, 'reset' => false, 'spec' => $this->spec]); + }); + $grid->column('part')->view('peidikeji.dcat-admin-extension-goods::goods-type.grid-attr'); }); } protected function form() { return Form::make(new GoodsType(), function (Form $form) { + $form->text('name'); - $form->array('attr', function (NestedForm $table) { - $table->text('name')->required(); - $table->text('group'); - $table->list('values'); - }); - $form->array('spec', function (NestedForm $table) { - $table->text('name')->required(); - $table->list('values'); - }); - $form->array('part', function (NestedForm $table) { - $table->text('name')->required(); - $table->list('values'); - }); + // $form->textarea('attr'); + // $form->textarea('spec'); + // $form->textarea('part'); $form->disableResetButton(); $form->disableCreatingCheck(); diff --git a/packages/goods/updates/GoodsTableSeeder.php b/packages/goods/updates/GoodsTableSeeder.php index fec700d..1bf8e89 100644 --- a/packages/goods/updates/GoodsTableSeeder.php +++ b/packages/goods/updates/GoodsTableSeeder.php @@ -36,11 +36,8 @@ class GoodsTableSeeder extends Seeder [ 'name' => '手机', 'attr' => [ - ['name' => '主体', 'values' => [ - ['name' => '入网型号', 'values' => ['5G', '4G']], - ['name' => '上市年份', 'values' => null], - ['name' => '品牌', 'values' => null] - ]] + ['name' => '主体', 'values' => ['入网型号', '上市年份', '品牌']], + ['name' => '显示器', 'values' => ['屏幕类型', '物理分辨率']], ], 'spec' => [ ['name' => '颜色', 'values' => ['白色', '红色', '黑色']], @@ -53,10 +50,7 @@ class GoodsTableSeeder extends Seeder [ 'name' => '笔记本电脑', 'attr' => [ - ['name' => '显示器', 'values' => [ - ['name' => '屏幕类型', 'values' => ['LED 背光显示屏']], - ['name' => '物理分辨率', 'values' => ['3072 x 1920 (226 ppi)']] - ]], + ['name' => '显示器', 'values' => ['屏幕类型', '物理分辨率']], ], 'spec' => [ ['name' => '颜色', 'values' => ['白色', '灰色']],