kphcdr 1 year ago
parent
commit
431f5a8c30

+ 2 - 6
app/Base/BaseModel.php

@@ -16,11 +16,7 @@ class BaseModel extends Model
 {
     protected $perPage = 10;
     protected $casts = [
-        'created_at' => 'datetime:Y-m-d H:i:s',
+        "extra" => "array",
     ];
-
-    protected function serializeDate(DateTimeInterface $date)
-    {
-        return $date->format('Y');
-    }
+    protected $guarded = ["*"];
 }

+ 72 - 0
app/Models/Goods/Spec.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Models\Goods;
+
+use App\Base\BaseModel;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Arr;
+
+/**
+ * App\Models\Goods\Spec
+ *
+ * @property int                                                                        $id
+ * @property string                                                                     $name
+ * @property array                                                                      $extra
+ * @property int                                                                        $is_custom 是否自定义
+ * @property \Illuminate\Support\Carbon|null                                            $created_at
+ * @property \Illuminate\Support\Carbon|null                                            $updated_at
+ * @property string|null                                                                $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec query()
+ * @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 whereIsCustom($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Spec whereUpdatedAt($value)
+ * @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
+{
+    use SoftDeletes;
+
+    const FORMAT_ATTR = "attr";
+    protected $table = "spec";
+
+    public function attrs()
+    {
+        return $this->hasMany(SpecAttr::class, "spec_id", "id");
+    }
+
+    public function format(...$options)
+    {
+        $return = [
+            "id" => $this->id,
+            "name" => $this->name,
+            "is_custom" => $this->is_custom,
+            "index_weight" => $this->index_weight,
+            "category_weight" => $this->category_weight,
+            "search_weight" => $this->search_weight,
+        ];
+
+        if (in_array(self::FORMAT_ATTR, $options)) {
+            $return['attr'] = $this->attrs->map(function (SpecAttr $m) {
+                return [
+                    "id" => $m->id,
+                    "name" => $m->name,
+                ];
+            });
+        }
+        return $return;
+    }
+}

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

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Models\Goods;
+
+use App\Base\BaseModel;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * App\Models\Goods\SpecAttr
+ *
+ * @property int                             $id
+ * @property int                             $spec_id
+ * @property string                          $name
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property string|null                     $deleted_at
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr query()
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereDeletedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereSpecId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|SpecAttr whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class SpecAttr extends BaseModel
+{
+    use SoftDeletes;
+
+    protected $table = "spec_attr";
+}

+ 80 - 0
app/Modules/Admin/Controllers/Admin/GoodsController.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Modules\Admin\Controllers\Admin;
+
+use App\Base\BaseController;
+use App\Models\Setting;
+use App\Modules\Admin\Services\GoodsService;
+use App\Modules\Admin\Services\SettingService;
+use Illuminate\Support\Arr;
+
+class GoodsController extends BaseController
+{
+    /** @var GoodsService $service */
+    protected $service;
+
+    public function __construct(GoodsService $authService)
+    {
+        $this->service = $authService;
+    }
+
+    public function specPaginate()
+    {
+        $data = $this->valid([
+            "name" => "",
+            "status" => "",
+            "page_size" => "",
+        ]);
+
+        return $this->ok($this->service->specPaginate($data));
+    }
+
+    public function specStore()
+    {
+        $params = $this->valid([
+            "id" => "",
+            "name" => "required",
+            "attr" => "array",
+            "index_weight" => "int",
+            "category_weight" => "int",
+            "search_weight" => "int",
+            "is_custom" => "int",
+        ]);
+
+        return $this->ok($this->service->specStore($params));
+    }
+
+    public function specInfo()
+    {
+        $params = $this->valid([
+            "id" => "required",
+        ]);
+
+        return $this->ok($this->service->specInfo($params));
+    }
+
+    public function specDelete()
+    {
+        $data = $this->valid([
+            "id" => "required",
+        ]);
+
+        return $this->ok($this->service->specDelete($data));
+    }
+
+    public function changeStatus()
+    {
+        $id = request()->input("id", 0);
+        $m = Setting::whereType(Setting::TYPE_BANNER)->where("id", $id)->firstOrFail();
+        $value = $m->value ?? [];
+
+        $isUse = 1;
+        if (Arr::get($value, "is_use")) {
+            $isUse = 0;
+        }
+        $value['is_use'] = $isUse;
+        $m->value = $value;
+        $m->save();
+        return $this->ok(true);
+    }
+}

+ 3 - 2
app/Modules/Admin/Services/AuthService.php

@@ -2,15 +2,16 @@
 
 namespace App\Modules\Admin\Services;
 
+use App\Base\BaseService;
 use App\Exceptions\ClientException;
 use App\Models\User\User;
 use Illuminate\Support\Facades\Auth;
 
-class AuthService
+class AuthService extends BaseService
 {
     public function login($data)
     {
-        $u = User::wherePhone($data['username'])->orWhere("email",$data['username'])->first();
+        $u = User::wherePhone($data['username'])->orWhere("email", $data['username'])->first();
         if (is_null($u)) {
             throw new ClientException("账号或密码错误,请重新输入");
         }

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

@@ -0,0 +1,90 @@
+<?php
+
+namespace App\Modules\Admin\Services;
+
+use App\Base\BaseService;
+use App\Exceptions\ClientException;
+use App\Models\Goods\Spec;
+use App\Models\Goods\SpecAttr;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\DB;
+
+class GoodsService extends BaseService
+{
+    public function specPaginate($params)
+    {
+        $p = Spec::query()->when($params['name'], function (Builder $query) use ($params) {
+            return $query->where("name", $params['name']);
+        })->orderByDesc("id")->paginate($params['page_size']);
+
+        return [
+            "total" => $p->total(),
+            "page_total" => $p->lastPage(),
+            "list" => array_map(function (Spec $u) {
+                return $u->format(Spec::FORMAT_ATTR);
+            }, $p->items()),
+        ];
+    }
+
+    public function specStore($params)
+    {
+        $id = $params['id'] ?? 0;
+        if ($id) {
+            $spec = Spec::find($id);
+        } else {
+            $spec = new Spec();
+        }
+        $spec->name = Arr::get($params, 'name');
+        $spec->index_weight = Arr::get($params, 'index_weight');
+        $spec->category_weight = Arr::get($params, 'category_weight');
+        $spec->search_weight = Arr::get($params, 'search_weight');
+        $spec->is_custom = Arr::get($params, 'is_custom');
+
+        DB::transaction(function () use ($params, $spec) {
+            $spec->save();
+            $attr = Arr::get($params, "attr", []);
+            $holdIdArr = Arr::pluck($attr, "id");
+            SpecAttr::query()->where("spec_id", $spec->id)->whereNotIn("id", $holdIdArr)->delete();
+
+            foreach ($attr as $k => $v) {
+                $id = Arr::get($v, "id");
+                if ($id) {
+                    $m = SpecAttr::whereSpecId($spec->id)->find($id);
+                    if (is_null($m)) {
+                        logger()->error("无法保存这个属性值:" . $v['name'] ?? "");
+                        throw new ClientException("无法保存这个属性值:" . $v['name'] ?? "");
+                    }
+                } else {
+                    $m = new SpecAttr();
+                }
+                $m->spec_id = $spec->id;
+                $m->name = $v['name'] ?? "";
+                $m->save();
+            }
+
+        });
+
+        return true;
+    }
+
+    public function specInfo($data)
+    {
+        $id = $data['id'];
+        $spec = Spec::findOrFail($id);
+        return $spec->format(Spec::FORMAT_ATTR);
+    }
+
+    public function specDelete($data)
+    {
+        $id = $data['id'] ?? 0;
+        // @TODO kphcdr 判断是否有商品还在使用这个规则,否则无法删除
+
+        $spec = Spec::find($id);
+        if ($spec) {
+            SpecAttr::where("spec_id", $spec->id)->delete();
+            $spec->delete();
+        }
+        return true;
+    }
+}

+ 2 - 1
app/Modules/Admin/Services/UserService.php

@@ -2,12 +2,13 @@
 
 namespace App\Modules\Admin\Services;
 
+use App\Base\BaseService;
 use App\Exceptions\ClientException;
 use App\Models\User\User;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Arr;
 
-class UserService
+class UserService extends BaseService
 {
     public function paginate($params)
     {

+ 5 - 0
routes/api.php

@@ -23,4 +23,9 @@ Route::middleware([\App\Http\Middleware\AdminAuthMiddleware::class])->group(func
     Route::get("/admin/common/settingMap", [\App\Modules\Admin\Controllers\Admin\CommonController::class, "settingMap"]);
     Route::post("/admin/common/settingSave", [\App\Modules\Admin\Controllers\Admin\CommonController::class, "settingSave"]);
 
+    Route::get("/admin/goods/specPaginate", [\App\Modules\Admin\Controllers\Admin\GoodsController::class, "specPaginate"]);
+    Route::get("/admin/goods/specInfo", [\App\Modules\Admin\Controllers\Admin\GoodsController::class, "specInfo"]);
+    Route::post("/admin/goods/specStore", [\App\Modules\Admin\Controllers\Admin\GoodsController::class, "specStore"]);
+    Route::post("/admin/goods/specDelete", [\App\Modules\Admin\Controllers\Admin\GoodsController::class, "specDelete"]);
+
 });