diff --git a/packages/goods/resources/lang/en/goods-brand.php b/packages/goods/resources/lang/en/goods-brand.php
new file mode 100644
index 0000000..0b67a5f
--- /dev/null
+++ b/packages/goods/resources/lang/en/goods-brand.php
@@ -0,0 +1,3 @@
+ [
+ 'GoodsBrand' => '品牌管理',
+ 'goods' => '商品管理',
+ 'brand' => '品牌',
+ ],
+ 'fields' => [
+ 'name' => '名称',
+ 'image' => '图片',
+ ]
+];
diff --git a/packages/goods/resources/lang/zh_CN/goods-type.php b/packages/goods/resources/lang/zh_CN/goods-type.php
new file mode 100644
index 0000000..e653e2f
--- /dev/null
+++ b/packages/goods/resources/lang/zh_CN/goods-type.php
@@ -0,0 +1,16 @@
+ [
+ 'GoodsType' => '商品类别',
+ 'goods' => '商品管理',
+ 'brand' => '类别',
+ ],
+ 'fields' => [
+ 'name' => '名称',
+ 'spec' => '规格',
+ 'attr' => '属性',
+ 'part' => '配件',
+ 'values' => '可选值',
+ ]
+];
diff --git a/packages/goods/resources/views/grid/part.blade.php b/packages/goods/resources/views/grid/part.blade.php
new file mode 100644
index 0000000..69a636a
--- /dev/null
+++ b/packages/goods/resources/views/grid/part.blade.php
@@ -0,0 +1,15 @@
+
+
+
+@if($value)
+@foreach($value as $item)
+
+ {{ $item['name'] }}
+ @if($item['values'])
+ @foreach($item['values'] as $subItem)
+ {{ $subItem }}
+ @endforeach
+ @endif
+
+@endforeach
+@endif
diff --git a/packages/goods/resources/views/grid/spec.blade.php b/packages/goods/resources/views/grid/spec.blade.php
index 697e800..e5aa0a5 100644
--- a/packages/goods/resources/views/grid/spec.blade.php
+++ b/packages/goods/resources/views/grid/spec.blade.php
@@ -5,9 +5,11 @@
@foreach($value as $item)
{{ $item['name'] }}
- @foreach($item['values'] as $value)
- {{ $value['value'] }}({{ $value['price'] }})
+ @if($item['values'])
+ @foreach($item['values'] as $subItem)
+ {{ $subItem['value'] }}({{ $subItem['price'] }})
@endforeach
+ @endif
@endforeach
@endif
diff --git a/packages/goods/src/GoodsServiceProvider.php b/packages/goods/src/GoodsServiceProvider.php
index 5d0f646..6dac8d7 100644
--- a/packages/goods/src/GoodsServiceProvider.php
+++ b/packages/goods/src/GoodsServiceProvider.php
@@ -10,6 +10,8 @@ class GoodsServiceProvider extends ServiceProvider
protected $menu = [
['title' => '商品管理', 'uri' => '', 'icon' => ''],
['title' => '商品分类', 'uri' => 'goods/category', 'icon' => '', 'parent' => '商品管理'],
+ ['title' => '品牌管理', 'uri' => 'goods/brand', 'icon' => '', 'parent' => '商品管理'],
+ ['title' => '商品类别', 'uri' => 'goods/type', 'icon' => '', 'parent' => '商品管理'],
['title' => '商品信息', 'uri' => 'goods', 'icon' => '', 'parent' => '商品管理'],
];
}
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsBrandController.php b/packages/goods/src/Http/Controllers/Admin/GoodsBrandController.php
new file mode 100644
index 0000000..65df6eb
--- /dev/null
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsBrandController.php
@@ -0,0 +1,50 @@
+disableRowSelector();
+
+ $grid->disableViewButton();
+
+ $grid->column('name');
+ $grid->column('image')->image('', 120);
+ });
+ }
+
+ protected function form()
+ {
+ return Form::make(new GoodsBrand(), function (Form $form) {
+ $form->text('name');
+ $form->image('image')->autoUpload()->saveFullUrl()->move('goods/brand');
+
+ $form->disableResetButton();
+ $form->disableCreatingCheck();
+ $form->disableViewCheck();
+ $form->disableEditingCheck();
+
+ $form->deleting(function (Form $form) {
+ $data = $form->model()->toArray();
+ foreach($data as $item) {
+ $id = data_get($item, 'id');
+ // 品牌下面包含商品, 阻止删除
+ if (Goods::where('brand_id', $id)->exists()) {
+ return $form->response()->error('请先删除关联的商品');
+ }
+ }
+ });
+ });
+ }
+}
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsCategoryController.php b/packages/goods/src/Http/Controllers/Admin/GoodsCategoryController.php
index 6223aef..c71c529 100644
--- a/packages/goods/src/Http/Controllers/Admin/GoodsCategoryController.php
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsCategoryController.php
@@ -35,7 +35,7 @@ class GoodsCategoryController extends AdminController
$form->text('name')->required();
$form->image('image')
->uniqueName()
- ->move('article-category')
+ ->move('goods/category')
->autoUpload();
$form->number('sort')
->min(0)
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsController.php b/packages/goods/src/Http/Controllers/Admin/GoodsController.php
index c5ab3c6..4263b2d 100644
--- a/packages/goods/src/Http/Controllers/Admin/GoodsController.php
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsController.php
@@ -93,16 +93,16 @@ class GoodsController extends AdminController
$form->image('cover_image')
->autoUpload()
->saveFullUrl()
- ->move('goods')
+ ->move('goods/goods')
->required();
$form->multipleImage('images')
->autoUpload()
->saveFullUrl()
- ->move('goods');
+ ->move('goods/goods');
$form->multipleImage('content')
->autoUpload()
->saveFullUrl()
- ->move('goods');
+ ->move('goods/goods');
$form->number('price')->min(0)->attribute('step', 0.01);
$form->switch('on_sale');
diff --git a/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php b/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php
new file mode 100644
index 0000000..87a9f1f
--- /dev/null
+++ b/packages/goods/src/Http/Controllers/Admin/GoodsTypeController.php
@@ -0,0 +1,64 @@
+disableRowSelector();
+ $grid->disableViewButton();
+
+ $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');
+ });
+ }
+
+ 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->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->disableResetButton();
+ $form->disableCreatingCheck();
+ $form->disableViewCheck();
+ $form->disableEditingCheck();
+
+ $form->deleting(function (Form $form) {
+ $data = $form->model()->toArray();
+ foreach($data as $item) {
+ $id = data_get($item, 'id');
+ // 下面包含商品, 阻止删除
+ if (Goods::where('type_id', $id)->exists()) {
+ return $form->response()->error('请先删除关联的商品');
+ }
+ }
+ });
+ });
+ }
+}
diff --git a/packages/goods/src/Http/routes.php b/packages/goods/src/Http/routes.php
index 4f98c7c..8337ee7 100644
--- a/packages/goods/src/Http/routes.php
+++ b/packages/goods/src/Http/routes.php
@@ -5,5 +5,7 @@ namespace Peidikeji\Goods\Http\Controllers\Admin;
use Illuminate\Support\Facades\Route;
Route::resource('goods/category', GoodsCategoryController::class);
+Route::resource('goods/brand', GoodsBrandController::class);
+Route::resource('goods/type', GoodsTypeController::class);
Route::resource('goods', GoodsController::class);
diff --git a/packages/goods/src/Models/GoodsBrand.php b/packages/goods/src/Models/GoodsBrand.php
index 367562c..c0a6b58 100644
--- a/packages/goods/src/Models/GoodsBrand.php
+++ b/packages/goods/src/Models/GoodsBrand.php
@@ -11,4 +11,9 @@ class GoodsBrand extends Model
protected $fillable = ['name', 'image'];
public $timestamps = false;
+
+ public function goods()
+ {
+ return $this->hasMany(Goods::class, 'brand_id');
+ }
}
diff --git a/packages/goods/updates/CreateGoodsTable.php b/packages/goods/updates/CreateGoodsTable.php
index 5ab70e6..0e81261 100644
--- a/packages/goods/updates/CreateGoodsTable.php
+++ b/packages/goods/updates/CreateGoodsTable.php
@@ -59,9 +59,9 @@ class CreateGoodsTable extends Migration
$table->unsignedInteger('stock')->default(0)->comment('库存');
$table->unsignedInteger('sold_count')->default(0)->comment('销量');
$table->decimal('price', 12, 2)->comment('售价');
- $table->json('attr')->nullable()->comment('属性');
- $table->json('spec')->nullable()->comment('规格');
- $table->json('part')->nullable()->comment('配件');
+ $table->json('attr')->nullable()->comment('属性[{name, value}]');
+ $table->json('spec')->nullable()->comment('规格[{name, values: [{value, price}]}]');
+ $table->json('part')->nullable()->comment('配件[{name, values: [{value, price}]}]');
$table->timestamps();
$table->softDeletes();
@@ -79,7 +79,7 @@ class CreateGoodsTable extends Migration
$table->string('name')->comment('名称');
$table->decimal('price', 12, 2)->comment('价格');
$table->unsignedInteger('stock')->comment('库存');
- $table->json('spec')->nullable()->comment('规格');
+ $table->json('spec')->nullable()->comment('规格[{name, value, price}]');
$table->foreign('goods_id')->references('id')->on('goods');