Browse Source

SEO优化

moshaorui 5 months ago
parent
commit
f28459c569

+ 5 - 1
app/Admin/Controllers/DistAdminDistributorController.php

@@ -165,15 +165,19 @@ class DistAdminDistributorController extends AdminController
             //保存后回调
             $form->saved(function (Form $form, $result) {
                 if ($form->isCreating()) {
+                    //创建后创建默认分类
                     $newId = $form->getKey();
                     $distProductCategory = new DistProductCategory();
-                    $distProductCategory->create([
+                    $categoryRow = $distProductCategory->create([
                         'parent_id' => 0,
                         'name' => 'Default Category',
                         'order' => 0,
                         'enabled' => 1,
                         'dist_id'=>$newId,
                     ]);
+                    //slug = id
+                    $categoryRow->slug = $categoryRow->id;
+                    $categoryRow->save();
                     //更新模版与变量
                     DistAppearance::switchTheme($form->input('appearance_id'), $newId);
                 }

+ 6 - 9
app/Admin/Controllers/DistInquiryController.php

@@ -84,20 +84,19 @@ class DistInquiryController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, new DistInquiry(), function (Show $show) {
-            $show->field('id');
             $show->field('order_number');
-            $show->field('whats_app');
-            $show->field('company_name');
             $show->field('customer_name');
+            $show->field('company_name');
+            $show->field('whats_app');
             $show->field('email');
             $show->field('consulting_products');
             $show->field('freight_forwarder');
             $show->field('business_model');
-            $show->field('ip_address');
-            $show->field('status')->using(config('dictionary.inquiryStatus'));
             $show->field('allocate_time');
             $show->field('distributor.company_name',admin_trans_label('distributor_company_name'));
             $show->field('content');
+            $show->field('ip_address');
+            $show->field('status')->using(config('dictionary.inquiryStatus'));
             $show->field('created_at');
             $show->field('updated_at');
             //按钮
@@ -114,16 +113,14 @@ class DistInquiryController extends AdminController
     protected function form()
     {
         return Form::make(new DistInquiry(), function (Form $form) {
-            $form->display('id');
             $form->display('order_number');
-            $form->text('whats_app');
-            $form->text('company_name');
             $form->text('customer_name');
+            $form->text('company_name');
+            $form->text('whats_app');
             $form->email('email');
             $form->text('consulting_products');
             $form->text('freight_forwarder');
             $form->text('business_model');
-            $form->ip('ip_address');
             $form->textarea('content');
         });
     }

+ 4 - 1
app/Admin/Repositories/BaseVideoCategory.php

@@ -15,7 +15,7 @@ class BaseVideoCategory extends EloquentRepository
     protected $eloquentClass = Model::class;
 
     // 调用模型方法
-    public static function selectOptions(\Closure $closure = null)
+    public static function selectOptions(\Closure $closure = null,$root = false)
     {
         if (!$closure) {
             $closure = function ($query) {
@@ -26,6 +26,9 @@ class BaseVideoCategory extends EloquentRepository
         }
 
         $selectOptions =  Model::class::selectOptions($closure);
+        if ($root == false) {
+            unset($selectOptions[0]);
+        }
         return $selectOptions;
     }
 }

+ 11 - 0
app/Distributor/Controllers/ApiController.php

@@ -3,6 +3,8 @@
 namespace App\Distributor\Controllers;
 
 use App\Distributor\Repositories\DistProduct;
+use App\Distributor\Repositories\DistProductCategory;
+use App\Distributor\Repositories\DistVideoCategory;
 use App\Distributor\Repositories\SitePages;
 use App\Distributor\Repositories\SitePagesTag;
 use Illuminate\Http\Request;
@@ -65,6 +67,15 @@ class ApiController extends Controller
                 $obj = new SitePages();
                 $result = $obj->generateSlug($title);
                 break;
+            case 'productCategory':
+                $obj = new DistProductCategory();
+                $result = $obj->generateSlug($title);
+                break;
+            case 'videoCategory':
+                $obj = new DistVideoCategory();
+                $result = $obj->generateSlug($title);
+                break;
+
         }
         return ['slug' => $result];
     }

+ 6 - 6
app/Distributor/Controllers/DistInquiryController.php

@@ -89,22 +89,22 @@ class DistInquiryController extends AdminDistController
     protected function detail($id)
     {
         return Show::make($id, new DistInquiry(), function (Show $show) {
-            $show->field('id');
             $show->field('order_number');
-            $show->field('whats_app');
-            $show->field('company_name');
             $show->field('customer_name');
+            $show->field('company_name');
+            $show->field('whats_app');
             $show->field('email');
             $show->field('consulting_products');
             $show->field('freight_forwarder');
             $show->field('business_model');
+            $show->field('content');
             $show->field('ip_address');
             $show->field('status')->using(config('dictionary.inquiryStatus'));
-            $show->field('allocate_time');
+
+        //    $show->field('allocate_time');
             //$show->field('distributor.company_name',admin_trans_label('distributor_company_name'));
-            $show->field('content');
             $show->field('created_at');
-            $show->field('updated_at');
+//            $show->field('updated_at');
             //按钮
             $show->disableDeleteButton();
             $show->disableEditButton();

+ 26 - 3
app/Distributor/Controllers/DistProductCategoryController.php

@@ -4,6 +4,7 @@ namespace App\Distributor\Controllers;
 
 use App\Distributor\Repositories\DistProductCategory;
 
+use App\Libraries\CommonHelper;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -94,14 +95,36 @@ class DistProductCategoryController extends AdminDistController
                 ->rules('numeric')
                 ->help(admin_trans_label('order_tips')); // 添加备注
             $form->switch('enabled')->default(1);
+            //SEO
+            $form->radio('visibility')->when(1,function (Form $form) {
+                $form->text('seo_title');
+                $form->text('seo_keywords');
+                $form->textarea('seo_description');
+                $form->text('slug',admin_trans_label('url_and_handle'))->width(9, 2)->prepend(getSiteDomain().config('dictionary.site_url.pages').'/');
+            })->options(config('dictionary.visibility'))->default(1)->value(1);
+            //隐藏字段
             $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            $form->ignore(['visibility']);
+            //新建时插入JS
+            $form->creating(function (Form $form) {
+                CommonHelper::seoReplace('name','productCategory');
+            });
             // 在保存时写死dist_id
             $form->saving(function (Form $form) {
                 $form->dist_id =getDistributorId();
+                //slug配置是否重复
+                $id = $form->getKey();
+                if ($form->slug != '') {
+                    if (DistProductCategory::isRepeatedSlug($id, $form->slug)) {
+                        //slug重复
+                        return $form->response()->error(admin_trans_label('url_repeated'));
+                    }
+                }
+                //当slug为空时生成slug
+                if ($form->slug == '') {
+                    $form->slug = DistProductCategory::generateSlug($form->title);
+                }
             });
-          //  $form->select('parameter_id', 'parameter')->options(DistProductParameter::selectOptions())->required();// DIST不需要绑定 parameter
-          //  $form->display('created_at');
-          //  $form->display('updated_at');
         });
     }
 }

+ 27 - 10
app/Distributor/Controllers/DistProductController.php

@@ -52,17 +52,11 @@ class DistProductController extends AdminDistController
             $grid->column('dist_product_category.name',admin_trans_label('category_name'));
             $grid->column('issuance_date');
             $grid->column('images')->display(function ($images) {
-
                 $images = $images->toArray();
                 $dataImages = array_column($images, 'image_url');
-
                 // 限制最多显示2个缩略图
                 $dataImages = array_slice($dataImages, 0, 2);
-
                 return CommonHelper::displayImage($dataImages,60);
-
-
-
             });
             //$grid->column('order')->orderable();
             $grid->column('is_pinned')->switch();
@@ -84,7 +78,8 @@ class DistProductController extends AdminDistController
             $grid->tools([
                 new DistProductImport(),
             ]);
-
+            //按钮
+            $grid->disableCreateButton();
         });
 
     }
@@ -137,6 +132,12 @@ class DistProductController extends AdminDistController
             $show->field('enabled')->using(config('dictionary.enabled'));
             $show->field('created_at');
             $show->field('updated_at');
+            $show->field('seo_title');
+            $show->field('seo_keywords');
+            $show->field('seo_description');
+            $show->field('slug',admin_trans_label('url_and_handle'))->as(function ($value) {
+                return getSiteDomain().config('dictionary.site_url.products').'/'.$value;
+            });
         });
     }
 
@@ -154,8 +155,6 @@ class DistProductController extends AdminDistController
                 ->required();
             $form->text('title')->required();
             $form->text('sku')->required();
-            $form->text('keywords');
-            $form->textarea('description');
             $form->date('issuance_date');
             $form->table('parameters',admin_trans_label('parameter_name'), function (Form\NestedForm $table) {
                 $table->text('key',admin_trans_field('key'))->required();
@@ -182,14 +181,23 @@ class DistProductController extends AdminDistController
             $form->editor('content');
             $form->switch('is_pinned')->default(0);
             $form->switch('enabled')->default(1);
+            //SEO
+            $form->radio('visibility')->when(1,function (Form $form) {
+                $form->text('seo_title');
+                $form->text('seo_keywords');
+                $form->textarea('seo_description');
+                $form->text('slug',admin_trans_label('url_and_handle'))->width(4, 2)->prepend(getSiteDomain().config('dictionary.site_url.products').'/');
+            })->options(config('dictionary.visibility'))->default(1)->value(1);
+            //隐藏字段
             $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
-
+            $form->ignore(['visibility']);
             //插入JS
             $this->addParametersJs();
             // 在保存时进行验证
             $form->saving(function (Form $form) {
                 $form->dist_id =getDistributorId();//保存时直接写死dist_id
 
+                /*
                 if (!$form->isCreating()) {
                     // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
                     $currentDistProduct = DistProduct::findById($form->getKey());
@@ -197,6 +205,7 @@ class DistProductController extends AdminDistController
                         throw new \Exception('Unable to modify the product because the distributor ID does not match.');
                     }
                 }
+                */
 
                 //保存前回调删除图片
                 if (!$form->isCreating()) {
@@ -210,6 +219,14 @@ class DistProductController extends AdminDistController
         });
     }
 
+    /*
+     * 禁用新增
+     */
+    public function store()
+    {
+        abort(404);
+    }
+
     /*
      * 以json型式返回产品参数
      */

+ 25 - 13
app/Distributor/Controllers/DistVideoCategoryController.php

@@ -4,6 +4,7 @@ namespace App\Distributor\Controllers;
 
 use App\Distributor\Repositories\DistVideo;
 use App\Distributor\Repositories\DistVideoCategory;
+use App\Libraries\CommonHelper;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -62,25 +63,36 @@ class DistVideoCategoryController extends AdminDistController
         return Form::make(new DistVideoCategory(), function (Form $form) {
             $form->display('id');
             $form->text('name')->required();
-            /*
-            $form->select('parent_id', admin_trans_field('parent'))
-                ->options([0 =>admin_trans_label('root')]) // 只显示 0 => root
-                ->saving(function ($v) {
-                    return (int) $v;
-                });
-            */
             $form->switch('enabled')->default(1);
+            //SEO
+            $form->radio('visibility')->when(1,function (Form $form) {
+                $form->text('seo_title');
+                $form->text('seo_keywords');
+                $form->textarea('seo_description');
+                $form->text('slug',admin_trans_label('url_and_handle'))->width(9, 2)->prepend(getSiteDomain().config('dictionary.site_url.video_category').'/');
+            })->options(config('dictionary.visibility'))->default(1)->value(1);
+            //隐藏
             $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            $form->ignore(['visibility']);
+            //新建时插入JS
+            $form->creating(function (Form $form) {
+                CommonHelper::seoReplace('name','videoCategory');
+            });
+            //保存前
             $form->saving(function (Form $form) {
                 $form->dist_id =getDistributorId();//保存时直接写死dist_id
-
-                if (!$form->isCreating()) {
-                    // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
-                    $current = DistVideoCategory::findById($form->getKey());
-                    if ($current && $current->dist_id !== $form->dist_id) {
-                        throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                $id = $form->getKey();
+                //slug配置是否重复
+                if ($form->slug != '') {
+                    if (DistVideoCategory::isRepeatedSlug($id, $form->slug)) {
+                        //slug重复
+                        return $form->response()->error(admin_trans_label('url_repeated'));
                     }
                 }
+                //当slug为空时生成slug
+                if ($form->slug == '') {
+                    $form->slug = DistVideoCategory::generateSlug($form->title);
+                }
             });
 
         });

+ 26 - 5
app/Distributor/Controllers/DistVideoController.php

@@ -113,6 +113,13 @@ class DistVideoController extends AdminDistController
             $show->field('enabled')->using(config('dictionary.enabled'));
             $show->field('created_at');
             $show->field('updated_at');
+            // SEO
+            $show->field('seo_title');
+            $show->field('seo_keywords');
+            $show->field('seo_description');
+            $show->field('slug',admin_trans_label('url_and_handle'))->as(function ($value) {
+                return getSiteDomain().config('dictionary.site_url.pages').'/'.$value;
+            });
         });
     }
 
@@ -139,17 +146,31 @@ class DistVideoController extends AdminDistController
             $form->editor('remark');
             $form->switch('is_pinned')->default(0);
             $form->switch('enabled')->default(1);
+            //SEO
+            $form->radio('visibility')->when(1,function (Form $form) {
+                $form->text('seo_title');
+                $form->text('seo_keywords');
+                $form->textarea('seo_description');
+                $form->text('slug',admin_trans_label('url_and_handle'))->width(4, 2)->prepend(getSiteDomain().config('dictionary.site_url.video').'/');
+            })->options(config('dictionary.visibility'))->default(1)->value(1);
+            //
             $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            $form->ignore(['visibility']);
             $form->saving(function (Form $form) {
                 $form->dist_id =getDistributorId();//保存时直接写死dist_id
 
-                if (!$form->isCreating()) {
-                    // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
-                    $currentDistProduct = DistVideo::findById($form->getKey());
-                    if ($currentDistProduct && $currentDistProduct->dist_id !== $form->dist_id) {
-                        throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                //slug配置是否重复
+                $id = $form->getKey();
+                if ($form->slug != '') {
+                    if (DistVideo::isRepeatedSlug($id, $form->slug)) {
+                        //slug重复
+                        return $form->response()->error(admin_trans_label('url_repeated'));
                     }
                 }
+                //当slug为空时生成slug
+                if ($form->slug == '') {
+                    $form->slug = DistVideo::generateSlug($form->title);
+                }
             });
         });
     }

+ 3 - 0
app/Distributor/Controllers/ImportProductController.php

@@ -149,6 +149,9 @@ class ImportProductController extends AdminDistController
                 return CommonHelper::displayImage($dataImages,150);
             })->unescape();
             $show->field('content')->unescape();
+            $show->field('seo_title');
+            $show->field('seo_keywords');
+            $show->field('seo_description');
             //$show->field('created_at');
             //$show->field('updated_at');
             // 禁用操作

+ 7 - 1
app/Distributor/Controllers/SitePagesController.php

@@ -102,6 +102,12 @@ class SitePagesController extends AdminDistController
             $show->field('status')->using(config('dictionary.pages_status'));
             $show->field('created_at');
             $show->field('updated_at');
+            $show->field('seo_title');
+            $show->field('seo_keywords');
+            $show->field('seo_description');
+            $show->field('slug',admin_trans_label('url_and_handle'))->as(function ($value) {
+                return getSiteDomain().config('dictionary.site_url.pages').'/'.$value;
+            });
         });
     }
 
@@ -137,7 +143,7 @@ class SitePagesController extends AdminDistController
                 $form->text('seo_title');
                 $form->text('seo_keywords');
                 $form->textarea('seo_description');
-                $form->text('slug',admin_trans_label('url_and_handle'))->width(4, 2)->prepend(getSiteDomain().config('dictionary.site_url.pages'));
+                $form->text('slug',admin_trans_label('url_and_handle'))->width(4, 2)->prepend(getSiteDomain().config('dictionary.site_url.pages').'/');
             })->options(config('dictionary.visibility'))->default(1)->value(1);
             //隐藏字段
             $form->hidden('dist_id',);

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

@@ -5,12 +5,14 @@ namespace App\Distributor\Repositories;
 use App\Models\DistProductCategory as Model;
 
 use App\Models\DistProductParameter;
+use App\Traits\DistSlugTrait;
 use Dcat\Admin\Repositories\EloquentRepository;
 use Illuminate\Support\Facades\Session;
 use function Symfony\Component\Translation\t;
 
 class DistProductCategory extends EloquentRepository
 {
+    use DistSlugTrait;
     /**
      * Model.
      *

+ 3 - 0
app/Distributor/Repositories/DistVideo.php

@@ -3,10 +3,13 @@
 namespace App\Distributor\Repositories;
 
 use App\Models\DistVideo as Model;
+use App\Traits\DistSlugTrait;
 use Dcat\Admin\Repositories\EloquentRepository;
 
 class DistVideo extends EloquentRepository
 {
+    use DistSlugTrait;
+
     /**
      * Model.
      *

+ 6 - 1
app/Distributor/Repositories/DistVideoCategory.php

@@ -3,10 +3,12 @@
 namespace App\Distributor\Repositories;
 
 use App\Models\DistVideoCategory as Model;
+use App\Traits\DistSlugTrait;
 use Dcat\Admin\Repositories\EloquentRepository;
 
 class DistVideoCategory extends EloquentRepository
 {
+    use DistSlugTrait;
     /**
      * Model.
      *
@@ -15,7 +17,7 @@ class DistVideoCategory extends EloquentRepository
     protected $eloquentClass = Model::class;
 
     // 调用模型方法
-    public static function selectOptions(\Closure $closure = null)
+    public static function selectOptions(\Closure $closure = null,$root = false)
     {
         if (!$closure) {
             $closure = function ($query) {
@@ -27,6 +29,9 @@ class DistVideoCategory extends EloquentRepository
         }
 
         $selectOptions =  Model::class::selectOptions($closure);
+        if ($root == false) {
+            unset($selectOptions[0]);
+        }
         return $selectOptions;
     }
 

+ 2 - 6
app/Libraries/CommonHelper.php

@@ -100,7 +100,7 @@ JS
         if ($titleName) {
             Admin::script(
 <<<JS
-    $('input[name="title"]').on('input', function() {
+    $('input[name="{$titleName}"]').on('input', function() {
         // 将 title 的值赋给 seo_title
         $('input[name="seo_title"]').val($(this).val());
     });
@@ -111,11 +111,7 @@ JS
         if ($modelName) {
             Admin::script(
 <<<JS
-    $('input[name="title"]').on('input', function() {
-        // 将 title 的值赋给 seo_title
-        $('input[name="seo_title"]').val($(this).val());
-    });
-    $('input[name="title"]').on('blur', function() {
+    $('input[name="{$titleName}"]').on('blur', function() {
         //通过ajax请求修改slug
         title = $(this).val();
         $.ajax({

+ 2 - 0
config/dictionary.php

@@ -63,6 +63,8 @@ return [
         'tags' => '/collections',
         'products' => '/products',
         'product_category' => '/product-category',
+        'video' => '/video',
+        'video_category' => '/video-category',
     ],
 
 ];