kphcdr 1 year ago
parent
commit
cf8dcec416

+ 55 - 0
app/Models/Goods/Category.php

@@ -3,8 +3,45 @@
 namespace App\Models\Goods;
 
 use App\Base\BaseModel;
+use Faker\Provider\Image;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
+/**
+ * App\Models\Goods\Category
+ *
+ * @property int                             $id
+ * @property string                          $name
+ * @property string                          $thumb
+ * @property int                             $level 层级
+ * @property int                             $parent_id 上级分类ID
+ * @property int                             $weight 权重
+ * @property int                             $index_weight 推荐位权重
+ * @property int                             $category_weight 推荐位权重
+ * @property int                             $search_weight 搜索页权重
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder|Category newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Category newQuery()
+ * @method static \Illuminate\Database\Query\Builder|Category onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder|Category query()
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereCategoryWeight($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereIndexWeight($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereLevel($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereParentId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereSearchWeight($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereThumb($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Category whereWeight($value)
+ * @method static \Illuminate\Database\Query\Builder|Category withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|Category withoutTrashed()
+ * @mixin \Eloquent
+ * @property-read Category|null              $parent
+ */
 class Category extends BaseModel
 {
     use SoftDeletes;
@@ -13,6 +50,24 @@ class Category extends BaseModel
 
     public function format(...$options)
     {
+        $return = [
+            "id" => $this->id,
+            "name" => $this->name,
+            "thumb" => $this->thumb,
+            "level" => $this->level,
+            "parent_id" => optional($this->parent)->id ?? 0,
+            "parent_name" => optional($this->parent)->name ?? 0,
+            "weight" => $this->weight,
+            "index_weight" => $this->index_weight,
+            "category_weight" => $this->category_weight,
+            "search_weight" => $this->search_weight,
+        ];
 
+        return $return;
+    }
+
+    public function parent()
+    {
+        return $this->belongsTo(Category::class, "parent_id");
     }
 }

+ 33 - 0
app/Models/Goods/Goods.php

@@ -5,6 +5,39 @@ namespace App\Models\Goods;
 use App\Base\BaseModel;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
+/**
+ * App\Models\Goods\Goods
+ *
+ * @property int                             $id
+ * @property string                          $name
+ * @property array                           $image_list
+ * @property array                           $spec 商品的规格
+ * @property int                             $weight
+ * @property string|null                     $desc_html
+ * @property string|null                     $spec_attr_html
+ * @property string|null                     $faq_html
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods newQuery()
+ * @method static \Illuminate\Database\Query\Builder|Goods onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods query()
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereDescHtml($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereFaqHtml($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereImageList($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereSpec($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereSpecAttrHtml($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Goods whereWeight($value)
+ * @method static \Illuminate\Database\Query\Builder|Goods withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|Goods withoutTrashed()
+ * @mixin \Eloquent
+ */
 class Goods extends BaseModel
 {
     use SoftDeletes;

+ 20 - 0
app/Models/Goods/GoodsCategoryMap.php

@@ -5,6 +5,26 @@ namespace App\Models\Goods;
 use App\Base\BaseModel;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
+/**
+ * App\Models\Goods\GoodsCategoryMap
+ *
+ * @property int                             $id
+ * @property int                             $goods_id
+ * @property int                             $category_id
+ * @property int                             $is_public 是否对普通会员展示
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap query()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereCategoryId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereGoodsId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereIsPublic($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsCategoryMap whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
 class GoodsCategoryMap extends BaseModel
 {
     protected $table = "goods_category_map";

+ 29 - 0
app/Models/Goods/GoodsSku.php

@@ -5,6 +5,35 @@ namespace App\Models\Goods;
 use App\Base\BaseModel;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
+/**
+ * App\Models\Goods\GoodsSku
+ *
+ * @property int                             $id
+ * @property int                             $goods_id
+ * @property string                          $sn 型号
+ * @property string $3d_url 3D的跳转地址
+ * @property array                           $spec_attr_list 规格数据
+ * @property int                             $is_use 是否使用
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku newQuery()
+ * @method static \Illuminate\Database\Query\Builder|GoodsSku onlyTrashed()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku query()
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku where3dUrl($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereGoodsId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereIsUse($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereSn($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereSpecAttrList($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|GoodsSku whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Query\Builder|GoodsSku withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|GoodsSku withoutTrashed()
+ * @mixin \Eloquent
+ */
 class GoodsSku extends BaseModel
 {
     use SoftDeletes;

+ 12 - 9
app/Models/Goods/Spec.php

@@ -12,29 +12,32 @@ use Illuminate\Support\Arr;
  * @property int                                                                        $id
  * @property string                                                                     $name
  * @property array                                                                      $extra
+ * @property int                                                                        $index_weight
+ * @property int                                                                        $category_weight
+ * @property int                                                                        $search_weight
  * @property int                                                                        $is_custom 是否自定义
  * @property \Illuminate\Support\Carbon|null                                            $created_at
  * @property \Illuminate\Support\Carbon|null                                            $updated_at
- * @property string|null                                                                $deleted_at
+ * @property \Illuminate\Support\Carbon|null                                            $deleted_at
+ * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Goods\SpecAttr[] $attrs
+ * @property-read int|null                                                              $attrs_count
  * @method static \Illuminate\Database\Eloquent\Builder|Spec newModelQuery()
  * @method static \Illuminate\Database\Eloquent\Builder|Spec newQuery()
+ * @method static \Illuminate\Database\Query\Builder|Spec onlyTrashed()
  * @method static \Illuminate\Database\Eloquent\Builder|Spec query()
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec whereCategoryWeight($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereCreatedAt($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereDeletedAt($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereExtra($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec whereIndexWeight($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereIsCustom($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec whereSearchWeight($value)
  * @method static \Illuminate\Database\Eloquent\Builder|Spec whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Query\Builder|Spec withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|Spec withoutTrashed()
  * @mixin \Eloquent
- * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Goods\SpecAttr[] $attrs
- * @property-read int|null                                                              $attrs_count
- * @property int                                                                        $index_weight
- * @property int                                                                        $category_weight
- * @property int                                                                        $search_weight
- * @method static \Illuminate\Database\Eloquent\Builder|Spec whereCategoryWeight($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Spec whereIndexWeight($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Spec whereSearchWeight($value)
  */
 class Spec extends BaseModel
 {

+ 3 - 0
app/Models/Goods/SpecAttr.php

@@ -24,6 +24,9 @@ use Illuminate\Database\Eloquent\SoftDeletes;
  * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereSpecId($value)
  * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereUpdatedAt($value)
  * @mixin \Eloquent
+ * @method static \Illuminate\Database\Query\Builder|SpecAttr onlyTrashed()
+ * @method static \Illuminate\Database\Query\Builder|SpecAttr withTrashed()
+ * @method static \Illuminate\Database\Query\Builder|SpecAttr withoutTrashed()
  */
 class SpecAttr extends BaseModel
 {

+ 32 - 14
app/Modules/Admin/Controllers/Admin/CategoryController.php

@@ -3,25 +3,28 @@
 namespace App\Modules\Admin\Controllers\Admin;
 
 use App\Base\BaseController;
+use App\Models\Goods\Category;
+use App\Modules\Admin\Services\CategoryService;
 use Faker\Provider\Image;
 
 class CategoryController extends BaseController
 {
+    /** @var CategoryService $service */
+    protected $service;
+
+    public function __construct(CategoryService $authService)
+    {
+        $this->service = $authService;
+    }
+
     public function paginate()
     {
-        $data = $this->valid([
-            "userinfo" => "",
-            "status" => "",
+        $params = $this->valid([
+            "name" => "",
+            "level" => "",
             "page_size" => "",
         ]);
-
-        return $this->ok([
-            "total" => 1,
-            "page_total" => 1,
-            "list" => [
-                $this->mockCategory(),
-            ],
-        ]);
+        return $this->ok($this->service->paginate($params));
     }
 
     protected function mockCategory()
@@ -44,12 +47,27 @@ class CategoryController extends BaseController
 
     public function store()
     {
-        return $this->ok($this->mockCategory());
+        $params = $this->valid([
+            "id" => "int",
+            "name" => "required|max:255",
+            "thumb" => "url",
+            "weight" => "int",
+            "parent_id" => "int",
+            "index_weight" => "int",
+            "category_weight" => "int",
+            "search_weight" => "int",
+        ]);
+        return $this->ok($this->service->store($params)->format());
     }
 
     public function info()
     {
-        return $this->ok($this->mockCategory());
+        $data = $this->valid([
+            "id" => "required",
+        ]);
+        /** @var Category $model */
+        $model = Category::findOrFail($data['id']);
+        return $this->ok($model->format());
     }
 
     public function del()
@@ -58,7 +76,7 @@ class CategoryController extends BaseController
             "id" => "required",
         ]);
 
-        return $this->ok();
+        return $this->ok($this->service->del($data));
     }
 
 }

+ 90 - 0
app/Modules/Admin/Services/CategoryService.php

@@ -0,0 +1,90 @@
+<?php
+
+namespace App\Modules\Admin\Services;
+
+use App\Base\BaseService;
+use App\Exceptions\ClientException;
+use App\Models\Goods\Category;
+use App\Models\Goods\GoodsCategoryMap;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Arr;
+
+class CategoryService extends BaseService
+{
+    public function paginate($params)
+    {
+        $p = Category::query()->when($params['level'], function (Builder $query) use ($params) {
+            return $query->where("level", $params['level']);
+        })->when($params['name'], function (Builder $query) use ($params) {
+            return $query->where(function (Builder $query) use ($params) {
+                return $query->where("name", "like", "%{$params['name']}%");
+            });
+        })->orderByDesc("id")->paginate($params['page_size']);
+
+        return [
+            "total" => $p->total(),
+            "page_total" => $p->lastPage(),
+            "list" => array_map(function (Category $model) {
+
+                return [
+                    "id" => $model->id,
+                    "name" => $model->name,
+                    "thumb" => $model->thumb,
+                    "level" => $model->level,
+                    "parent_id" => optional($model->parent)->id ?? 0,
+                    "parent_name" => optional($model->parent)->name ?? "",
+                    "child_category_count" => 1, #TODO
+                    "child_goods_count" => 1, #TODO
+                    "weight" => $model->weight,
+                    "index_weight" => $model->index_weight,
+                    "category_weight" => $model->category_weight,
+                    "search_weight" => $model->search_weight,
+                    "created_at" => $model->created_at->format("Y-m-d"),
+                ];
+            }, $p->items()),
+        ];
+    }
+
+    public function store($params): Category
+    {
+        $id = $params['id'] ?? 0;
+        if ($id) {
+            $model = Category::find($id);
+        } else {
+            $model = new Category();
+        }
+        $model->name = Arr::get($params, 'name');
+        $model->thumb = Arr::get($params, 'thumb');
+        $model->index_weight = Arr::get($params, 'index_weight');
+        $model->category_weight = Arr::get($params, 'category_weight');
+        $model->search_weight = Arr::get($params, 'search_weight');
+        $model->parent_id = Arr::get($params, 'parent_id', 0);
+        $model->level = 1;
+        if ($model->parent_id) {
+            if ($model->parent_id == $model->id) {
+                throw new ClientException("上级类目不能是当前类目");
+            }
+            $parent = Category::findOrFail($model->parent_id);
+            $model->level = $parent->level + 1;
+        }
+
+        $model->save();
+
+        return $model;
+    }
+
+    public function del($params)
+    {
+        $category = Category::findOrFail($params['id']);
+
+        if ($count = Category::where("parent_id", $category->id)->count() > 0) {
+            throw new ClientException("该类目下还有{$count}个子分类,请先删除子类目");
+        }
+
+        if ($count = GoodsCategoryMap::where("category_id", $category->id)->count()) {
+            throw new ClientException("该类目下有{$count}个商品,请先修改对应商品");
+        }
+
+        $category->delete();
+    }
+}