moshaorui před 4 měsíci
rodič
revize
7c000775c2

+ 3 - 3
app/Admin/Repositories/BaseProductCategory.php

@@ -52,15 +52,15 @@ class BaseProductCategory extends EloquentRepository
         }
 
         // 返回键值对数组,并按 'name' 和 'order' 字段排序
-        $results = $query->orderBy('name')->orderBy('order')->pluck('name', 'id');
+        $results = $query->orderBy('order', 'asc')->pluck('name', 'id');
 
         // 在每个 name 前面加上 '├─'
         $results = $results->map(function ($name) {
             return '├─' . $name;
         });
 
-        return $results->all();
-
+        $all = array_replace([0 => admin_trans_label('root')],$results->all());
+        return $all;
     }
 
 

+ 2 - 2
app/Distributor/Actions/MenuShow.php

@@ -10,15 +10,15 @@ class MenuShow extends RowAction
     public function handle()
     {
         $key = $this->getKey();
-
         $menu = SiteMenu::where('id', $key)->first();
         $menu->show = $menu->show ? 0 : 1;
         $menu->save();
 
+        $location = $menu->menu_location;
         return $this
             ->response()
             ->success(trans('admin.update_succeeded'))
-            ->location('site-menu');
+            ->location('site-menu?location='.$location);
     }
 
     public function title()

+ 5 - 2
app/Distributor/Controllers/ApiController.php

@@ -56,10 +56,13 @@ class ApiController extends Controller
     }
 
 
+    /*
+     * 把数据转换成select需要的格式
+     */
     private function changeOptions($data) {
-// 初始化结果数组
+        // 初始化结果数组
         $result = [];
-// 遍历原始数据并转换格式
+        // 遍历原始数据并转换格式
         foreach ($data as $id => $text) {
             $result[] = [
                 'id' => (int)$id,  // 将字符串转换为整数

+ 1 - 1
app/Distributor/Controllers/SiteMenuController.php

@@ -56,7 +56,7 @@ class SiteMenuController extends AdminDistController
                 }
                 return implode(' - ', $arr);
             });
-            //操作
+            //是否显示操作
             $tree->actions(function (Tree\Actions $actions) {
                 $actions->prepend(new MenuShow());
             });

+ 131 - 0
app/Distributor/Controllers/SitePagesController.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace App\Distributor\Controllers;
+
+use App\Distributor\Repositories\SitePages;
+use App\Models\SitePages as Model;
+use App\Distributor\Repositories\SitePagesTag;
+use App\Libraries\CommonHelper;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Models\Permission;
+use Dcat\Admin\Show;
+use Dcat\Admin\Http\Controllers\AdminController;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Admin;
+
+class SitePagesController extends AdminDistController
+{
+    /**
+     * page index
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header('列表')
+            ->description('全部')
+            ->breadcrumb(['text'=>'列表','url'=>''])
+            ->body($this->grid());
+    }
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(SitePages::with(['pagesTag']), function (Grid $grid) {
+            $grid->column('id')->sortable();
+            $grid->column('title');
+            $grid->column('pagesTag',admin_trans_label('tags'))->pluck('name')->label();
+            $grid->column('cover_image')->display(function ($image) {
+                // 开始生成 HTML
+                $dataImages = [$image];
+                return CommonHelper::displayImage($dataImages,100);
+            });
+            $grid->column('post_date');
+            $grid->column('status')->using(config('dictionary.pages_status'));
+            $grid->column('updated_at')->sortable();
+            $grid->column('created_at');
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->panel();
+                $filter->expand();
+                $filter->like('title')->width(2);
+            });
+            //权限与条件
+            $grid->model()->where('dist_id', getDistributorId())->orderBy('id', 'desc');
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, Model::with(['pagesTag']), function (Show $show) {
+            $pagesTag  = $show->model()->pagesTag->toArray();
+            $show->field('id');
+            $show->field('title');
+            $show->field('pagesTag',admin_trans_label('tags'))->as(function ($value) use ($pagesTag) {
+                return array_column($pagesTag,'name');
+            })->label();
+            $show->field('author');
+            $show->field('post_date');
+            $show->field('cover_image')->as(function ($image) {
+                // 开始生成 HTML
+                $dataImages = [$image];
+                return CommonHelper::displayImage($dataImages,150);
+            })->unescape();
+            $show->field('content')->unescape();
+            $show->field('status')->using(config('dictionary.pages_status'));
+            $show->field('created_at');
+            $show->field('updated_at');
+        });
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        return Form::make(SitePages::with(['pagesTag']), function (Form $form) {
+            $form->text('title')->required();
+            $form->text('author');
+            $form->date('post_date')->format('YYYY-MM-DD')->required();
+            $form->tags('pagesTag', '文章标签')
+                ->setView('admin.form_custom.tags')
+                ->pluck('name', 'name') // name 为需要显示的 Tag 模型的字段,id 为主键
+                ->options(SitePagesTag::all())
+                ->saving(function ($value) {
+                    $value = SitePagesTag::handleTags($value);
+                    return $value;
+                });
+            $form->image("cover_image")
+                ->autoUpload()
+                ->uniqueName()
+                ->accept(config('admin.upload.oss_image.accept'))
+                ->maxSize(config('admin.upload.oss_image.max_size'))
+                ->dir('images/pages/'.date("Ymd"));
+            $form->editor('content')->required();
+            $form->switch('status',admin_trans_label('publish'))->default(1);
+            $form->hidden('slug');
+            $form->hidden('dist_id');
+            //保存前,强制写死dist_id
+            $form->saving(function (Form $form) {
+                //$form->pagesTag = [1,2];
+                $form->dist_id = getDistributorId();
+                //生成slug
+                if ($form->isCreating()) {
+                    $form->slug = SitePages::generateSlug($form->title);
+                }
+            });
+        });
+    }
+}

+ 0 - 94
app/Distributor/Controllers/SitePostController.php

@@ -1,94 +0,0 @@
-<?php
-
-namespace App\Distributor\Controllers;
-
-use App\Distributor\Repositories\SitePost;
-use Dcat\Admin\Form;
-use Dcat\Admin\Grid;
-use Dcat\Admin\Show;
-use Dcat\Admin\Http\Controllers\AdminController;
-use Dcat\Admin\Layout\Content;
-use Dcat\Admin\Admin;
-
-class SitePostController extends AdminDistController
-{
-    /**
-     * page index
-     */
-    public function index(Content $content)
-    {
-        return $content
-            ->header('列表')
-            ->description('全部')
-            ->breadcrumb(['text'=>'列表','url'=>''])
-            ->body($this->grid());
-    }
-
-    /**
-     * Make a grid builder.
-     *
-     * @return Grid
-     */
-    protected function grid()
-    {
-        return Grid::make(new SitePost(), function (Grid $grid) {
-            $grid->column('id')->sortable();
-            $grid->column('title');
-            $grid->column('content');
-            $grid->column('slug');
-            $grid->column('status');
-            $grid->column('author');
-            $grid->column('post_date');
-            $grid->column('created_at');
-            $grid->column('updated_at')->sortable();
-
-            $grid->filter(function (Grid\Filter $filter) {
-                $filter->equal('id');
-
-            });
-        });
-    }
-
-    /**
-     * Make a show builder.
-     *
-     * @param mixed $id
-     *
-     * @return Show
-     */
-    protected function detail($id)
-    {
-        return Show::make($id, new SitePost(), function (Show $show) {
-            $show->field('id');
-            $show->field('title');
-            $show->field('content');
-            $show->field('slug');
-            $show->field('status');
-            $show->field('author');
-            $show->field('post_date');
-            $show->field('created_at');
-            $show->field('updated_at');
-        });
-    }
-
-    /**
-     * Make a form builder.
-     *
-     * @return Form
-     */
-    protected function form()
-    {
-        return Form::make(new SitePost(), function (Form $form) {
-            $form->display('id');
-            $form->text('title');
-            $form->text('content');
-            $form->text('slug');
-            $form->text('status');
-            $form->text('author');
-            $form->text('post_date');
-
-            $form->display('created_at');
-            $form->display('updated_at');
-        });
-    }
-}

+ 5 - 4
app/Distributor/Repositories/DistProductCategory.php

@@ -7,6 +7,7 @@ use App\Models\DistProductCategory as Model;
 use App\Models\DistProductParameter;
 use Dcat\Admin\Repositories\EloquentRepository;
 use Illuminate\Support\Facades\Session;
+use function Symfony\Component\Translation\t;
 
 class DistProductCategory extends EloquentRepository
 {
@@ -50,15 +51,15 @@ class DistProductCategory extends EloquentRepository
         $query->where('dist_id', getDistributorId());
 
         // 返回键值对数组,并按 'name' 和 'order' 字段排序
-        $results = $query->orderBy('name')->orderBy('order')->pluck('name', 'id');
+        $results = $query->orderBy('order', 'asc')->pluck('name', 'id');
 
         // 在每个 name 前面加上 '├─'
         $results = $results->map(function ($name) {
             return '├─' . $name;
         });
 
-        return $results->all();
-
+        $all = array_replace([0 => admin_trans_label('root')],$results->all());
+        return $all;
     }
 
     // 调用模型方法
@@ -98,7 +99,7 @@ class DistProductCategory extends EloquentRepository
         // 获取模型对象
         $obj = $this->model();
 
-        $obj = $obj->orderBy('order', 'asc')->where('dist_id', getDistributorId());
+        $obj = $obj->where('dist_id', getDistributorId())->orderBy('order', 'asc');
 
         // 获取数据
         $tree = $obj->get();

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

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

+ 44 - 0
app/Distributor/Repositories/SitePagesTag.php

@@ -3,10 +3,12 @@
 namespace App\Distributor\Repositories;
 
 use App\Models\SitePagesTag as Model;
+use App\Traits\DistCommonTrait;
 use Dcat\Admin\Repositories\EloquentRepository;
 
 class SitePagesTag extends EloquentRepository
 {
+    use DistCommonTrait;
     /**
      * Model.
      *
@@ -29,4 +31,46 @@ class SitePagesTag extends EloquentRepository
     {
         return Model::where('id', $id)->where('dist_id', getDistributorId())->first();
     }
+
+    /*
+     * 查询全部标签
+     */
+    public static function all()
+    {
+        $result =  Model::where('dist_id', getDistributorId())->get();
+        return $result;
+    }
+
+    /*
+     * 处理标签
+     */
+    public static function handleTags($tags)
+    {
+        $self = new self();
+        $model = new Model();
+        if (!is_array($tags)) {
+            $tagArray = explode(',', $tags);
+        } else {
+            $tagArray = $tags;
+        }
+        $tagArray = array_map('trim', $tagArray);
+        $existingTags = $model
+            ->whereIn('name', $tagArray)
+            ->pluck('id', 'name')  // We also get the name => id mapping
+            ->toArray();
+        $tagsToInsert = array_diff($tagArray, array_keys($existingTags));
+        foreach ($tagsToInsert as $tag) {
+            $id = $model->insertGetId([
+                'name' => $tag,
+                'slug' => $self->generateSlug($tag),
+                'dist_id'=> getDistributorId(),
+                'created_at' => now(),
+            ]);
+            $existingTags[$tag] = $id;
+        }
+        // Return the ids as an array
+        return array_values($existingTags);
+    }
+
+
 }

+ 2 - 0
app/Distributor/routes.php

@@ -47,6 +47,8 @@ Route::group([
     $router->get('site-menu/{id}/edit', 'SiteMenuController@edit');//编辑
     $router->put('site-menu/{id}', 'SiteMenuController@update');//编辑保存
     $router->delete('site-menu/{id}', 'SiteMenuController@destroy');//删除
+    //文章管理
+    $router->resource('site-pages', 'SitePagesController');
     //API相关
     $router->get('api/products', 'ApiController@products');
     $router->get('api/pages', 'ApiController@pages');

+ 14 - 0
app/Models/SitePages.php

@@ -11,4 +11,18 @@ class SitePages extends Model
 	use HasDateTimeFormatter;
     protected $table = 'site_pages';
 
+    /**
+     * 定义你的关联模型.
+     *
+     * @return BelongsToMany
+     */
+    public function pagesTag()
+    {
+
+        $pivotTable = 'site_pages_tag_relationship'; // 中间表
+
+        $relatedModel = SitePagesTag::class; // 关联模型类名
+
+        return $this->belongsToMany($relatedModel, $pivotTable, 'pages_id', 'tag_id');
+    }
 }

+ 35 - 0
app/Traits/DistCommonTrait.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Traits;
+
+use ArrayAccess;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\SoftDeletingScope;
+use Illuminate\Support\Facades\Event;
+use InvalidArgumentException;
+use Spatie\EloquentSortable\EloquentModelSortedEvent;
+use Spatie\EloquentSortable\Sortable;
+
+/*
+ * 列表排序is_pinned desc,order desc时用这个trait
+ */
+trait DistCommonTrait
+{
+    /*
+     * 生成slug
+     */
+    public static function generateSlug($title) {
+        $self = new self();
+        $model = $self->model();
+        $slug = generateSlug($title);
+        for ($i=0;$i<5;$i++) {
+            $count = $model->where('slug', $title)->where('dist_id', getDistributorId())->count();
+            if ($count == 0) {
+                return $slug;
+            } else {
+                $slug = $slug . '-' . generateRandomString();
+            }
+        }
+        return $slug . '-' . generateRandomString(5);
+    }
+}

+ 30 - 0
app/helpers.php

@@ -155,6 +155,36 @@ if (!function_exists('isDomainOnly')) {
     }
 }
 
+//生成slug
+if (!function_exists('generateSlug')) {
+    function generateSlug($title)
+    {
+        // 1. 将所有字符转换为小写
+        $slug = strtolower($title);
+        // 2. 将空格替换为短横线(-)
+        $slug = str_replace(' ', '-', $slug);
+        // 3. 将不合法的字符(!@#$%^&*?=+)替换为空
+        $slug = preg_replace('/[!@#$%^&*()?=+]+/', '', $slug);
+        // 4. 清理多余的短横线
+        $slug = preg_replace('/-+/', '-', $slug);
+        // 5. 去除开头和结尾的短横线
+        $slug = trim($slug, '-');
+        return $slug;
+    }
+}
+
+//生成随机小写英文组成的字符串
+if (!function_exists('generateRandomString')) {
+    function generateRandomString($length = 3) {
+        $characters = 'abcdefghijklmnopqrstuvwxyz';
+        $charactersLength = strlen($characters);
+        $randomString = '';
+        for ($i = 0; $i < $length; $i++) {
+            $randomString .= $characters[rand(0, $charactersLength - 1)];
+        }
+        return $randomString;
+    }
+}
 
 
 

+ 5 - 0
config/dictionary.php

@@ -47,5 +47,10 @@ return [
         '0' => 'Product Category',
         '1' => 'Posts Tag',
     ],
+    //文章状态
+    'pages_status' => [
+        '0' => 'Draft',
+        '1' => 'Published',
+    ],
 
 ];

+ 6 - 1
lang/zh_CN/global.php

@@ -23,7 +23,7 @@ return [
         'input'                 => '输入',
         'type'                  => '类型',
         'productslist'          => '产品列表',
-        'title'                 => '产品标题',
+        'title'                 => '标题',
         'keywords'              => '关健字',
         'description'           => '描述',
         'sku'                   => '商品sku',
@@ -76,6 +76,9 @@ return [
         'collections_type'      => '集合类型',
         'product_category'      => '产品分类',
         'pages_tag'             => '文章标签',
+        'post_date'             => '发布日期',
+        'author'                => '作者',
+
     ],
     'labels' => [
         'list'         => '列表',
@@ -115,6 +118,8 @@ return [
         'select_product'        => '选择产品',
         'select_pages'          => '选择页面',
         'select_category'       => '选择分类',
+        'publish'              => '发报',
+        'tags'                  => '标签',
     ],
     'options' => [
         //

+ 1 - 0
lang/zh_CN/menu.php

@@ -33,5 +33,6 @@ return [
         'domain'    => '域名',
         'top_menu'  => '顶部菜单',
         'footer_menu'  => '底部菜单',
+        'pages' => '文章',
     ],
 ];

+ 74 - 0
resources/views/admin/form_custom/tags.blade.php

@@ -0,0 +1,74 @@
+<div class="{{$viewClass['form-group']}}">
+
+    <label class="{{$viewClass['label']}} control-label">{!! $label !!}</label>
+
+    <div class="{{$viewClass['field']}}">
+
+        @include('admin::form.error')
+
+        <select class="form-control {{$class}}" style="width: 100%;" name="{{$name}}[]" multiple="multiple" data-placeholder="{{ $placeholder }}" {!! $attributes !!} >
+            @foreach($options as $key => $option)
+                <option value="{{ $keyAsValue ? $key : $option}}" {{ in_array($option, $value) ? 'selected' : '' }}>{{$option}}</option>
+            @endforeach
+        </select>
+        <input type="hidden" name="{{$name}}[]" />
+
+        @include('admin::form.help-block')
+
+    </div>
+</div>
+
+<script init="{!! $selector !!}" require="@select2?lang={{ config('app.locale') === 'en' ? '' : str_replace('_', '-', config('app.locale')) }}">
+    var options = {
+        tags: true,
+        createTag: function(params) {
+            var str = params.term.trim().replace(/[,;,;]*$/, '');
+            return { id: str, text: str }
+            // if (/[,;,; ]/.test(params.term)) {
+            //     var str = params.term.trim().replace(/[,;,;]*$/, '');
+            //     return { id: str, text: str }
+            // } else {
+            //     return null;
+            // }
+        }
+    };
+
+    @if(isset($ajax))
+    options = $.extend(options, {
+        ajax: {
+            url: "{!! $ajax['url'] !!}",
+            dataType: 'json',
+            delay: 250,
+            cache: true,
+            data: function (params) {
+                return {
+                    q: params.term,
+                    page: params.page
+                };
+            },
+            processResults: function (data, params) {
+                params.page = params.page || 1;
+
+                return {
+                    results: $.map(data.data, function (d) {
+                        d.id = d.{{ $ajax['idField'] }};
+                        d.text = d.{{ $ajax['textField'] }};
+                        return d;
+                    }),
+                    pagination: {
+                        more: data.next_page_url
+                    }
+                };
+            },
+        },
+        escapeMarkup: function (markup) {
+            return markup;
+        },
+    });
+    @endif
+
+    $this.select2(options);
+
+</script>
+
+