7 changed files with 489 additions and 0 deletions
-
226app/Admin/Controllers/v3/GoodsNewController.php
-
16app/Admin/Repositories/v3/GoodsNew.php
-
2app/Admin/routes.php
-
70app/Models/v3/GoodsNew.php
-
18app/Models/v3/GoodsNewBanners.php
-
115app/Models/v3/StoreNew.php
-
42resources/lang/zh-CN/goods-new.php
@ -0,0 +1,226 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Admin\Controllers\v3; |
||||
|
|
||||
|
use App\Admin\Actions\Grid\GoodsCopy; |
||||
|
use App\Admin\Repositories\v3\GoodsNew; |
||||
|
use Dcat\Admin\Form; |
||||
|
use Dcat\Admin\Grid; |
||||
|
use Dcat\Admin\Show; |
||||
|
use Dcat\Admin\Controllers\AdminController; |
||||
|
use App\Models\v3\Category as CategoryModel; |
||||
|
use App\Models\v3\StoreNew as StoreModel; |
||||
|
use Dcat\Admin\Form\NestedForm; |
||||
|
use App\Models\v3\GoodsNew as GoodsModel; |
||||
|
use App\Models\v3\Market as MarketModel; |
||||
|
use Dcat\Admin\Grid\Displayers\Actions; |
||||
|
use App\Models\v3\GoodsCategory as GoodsCategoryModel; |
||||
|
|
||||
|
class GoodsNewController extends AdminController |
||||
|
{ |
||||
|
/** |
||||
|
* Make a grid builder. |
||||
|
* |
||||
|
* @return Grid |
||||
|
*/ |
||||
|
protected function grid() |
||||
|
{ |
||||
|
return Grid::make(new GoodsNew(), function (Grid $grid) { |
||||
|
$grid->id->sortable(); |
||||
|
$grid->cover_img_url->image('',50); |
||||
|
$grid->name; |
||||
|
$grid->price; |
||||
|
$grid->column('market_id')->display(function($marketId){ |
||||
|
$item = MarketModel::getMarketInfo($marketId,'name'); |
||||
|
return empty($item) ? '' : $item->name; |
||||
|
}); |
||||
|
$grid->store_id->display(function ($storeId){ |
||||
|
$store = StoreModel::getStoreInfo($storeId,'name'); |
||||
|
return empty($store) ? '' : $store->name; |
||||
|
}); |
||||
|
$grid->category_id->display(function ($categoryId){ |
||||
|
$item = CategoryModel::getInfo($categoryId,'title'); |
||||
|
return empty($item) ? '' : $item->title; |
||||
|
}); |
||||
|
$grid->goods_category_id->display(function ($goodsCategoryId){ |
||||
|
$item = GoodsCategoryModel::getInfo($goodsCategoryId,'title'); |
||||
|
return empty($item) ? '' : $item->title; |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
$grid->sort->sortable(); |
||||
|
$grid->on_sale->switch(); |
||||
|
|
||||
|
$grid->actions([new GoodsCopy()]); |
||||
|
$grid->filter(function (Grid\Filter $filter) { |
||||
|
$filter->like('name'); |
||||
|
}); |
||||
|
|
||||
|
$grid->model()->orderBy('id', 'desc'); |
||||
|
// 每页10条
|
||||
|
$grid->paginate(10); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Make a show builder. |
||||
|
* |
||||
|
* @param mixed $id |
||||
|
* |
||||
|
* @return Show |
||||
|
*/ |
||||
|
protected function detail($id) |
||||
|
{ |
||||
|
// $g = GoodsModel::find(1572);
|
||||
|
// dd($g->toArray());
|
||||
|
return Show::make($id, new GoodsNew(), function (Show $show) { |
||||
|
$show->row(function (Show\Row $show) { |
||||
|
$show->width(6)->field('id'); |
||||
|
$show->width(6)->field('name'); |
||||
|
$show->width(6)->category_id->as(function ($categoryId){ |
||||
|
$item = CategoryModel::getInfo($categoryId,'title'); |
||||
|
return empty($item) ? '' : $item->title; |
||||
|
}); |
||||
|
$show->width(6)->store_id->as(function ($storeId){ |
||||
|
$item = GoodsCategoryModel::getInfo($storeId,'name'); |
||||
|
return empty($item) ? '' : $item->name; |
||||
|
}); |
||||
|
$show->width(6)->store_id->as(function ($goodsCategoryId){ |
||||
|
$item = StoreModel::getStoreInfo($goodsCategoryId,'name'); |
||||
|
return empty($item) ? '' : $item->name; |
||||
|
}); |
||||
|
$show->width(6)->cover_img->image(); |
||||
|
$show->width(6)->price; |
||||
|
$show->width(6)->original_price; |
||||
|
$show->width(6)->vip_price; |
||||
|
$show->width(6)->inventory; |
||||
|
$show->width(6)->goods_unit; |
||||
|
|
||||
|
}); |
||||
|
$show->row(function (Show\Row $show) { |
||||
|
$show->width(6)->on_sale_text; |
||||
|
$show->width(6)->content; |
||||
|
$show->width(6)->sort; |
||||
|
$show->width(6)->restrict_num; |
||||
|
$show->width(6)->start_num; |
||||
|
$show->width(6)->is_infinite_text; |
||||
|
|
||||
|
$show->width(6)->tags->as(function ($value){ |
||||
|
return $value; |
||||
|
}); |
||||
|
$show->width(6)->spec->as(function ($value){ |
||||
|
$text = ''; |
||||
|
foreach ($value as $v){ |
||||
|
$text .= '【'.$v['spec_key'] .':'.$v['spec_value'].'】 '; |
||||
|
} |
||||
|
return $text; |
||||
|
}); |
||||
|
$goodsModel = new GoodsModel(); |
||||
|
$show->html(function () use($goodsModel){ |
||||
|
if(empty($this->details_imgs)){ |
||||
|
return ''; |
||||
|
}else{ |
||||
|
// 还需要优化
|
||||
|
$value = $this->details_imgs; |
||||
|
$text = ''; |
||||
|
foreach ($value as $v){ |
||||
|
$img = $goodsModel->imageUrl($v); |
||||
|
$text .= "<img src='$img' />"; |
||||
|
} |
||||
|
return $text; |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// $show->created_at;
|
||||
|
// $show->updated_at;
|
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Make a form builder. |
||||
|
* |
||||
|
* @return Form |
||||
|
*/ |
||||
|
protected function form() |
||||
|
{ |
||||
|
$builder = GoodsModel::with(['ImageBanners','VideoBanners']); |
||||
|
|
||||
|
return Form::make($builder, function (Form $form) { |
||||
|
$form->hidden('id'); |
||||
|
|
||||
|
// 二级分类
|
||||
|
$categoryList = CategoryModel::getArray([['parent_id','>',0]]); |
||||
|
// 商品类目
|
||||
|
$goodsCategoryList = GoodsCategoryModel::getArray(); |
||||
|
// 店铺
|
||||
|
$storeList = StoreModel::getStoreArray(); |
||||
|
//市场
|
||||
|
// $marketList = MarketModel::getMarketArray();
|
||||
|
|
||||
|
$form->column(6, function (Form $form) use($storeList,$categoryList,$goodsCategoryList ){ |
||||
|
// $form->select('market_id')->required()->options($marketList);
|
||||
|
$form->select('category_id')->required()->options($categoryList)->load('goods_category_id', '/api/goods_category_list'); |
||||
|
$form->select('goods_category_id')->required(); |
||||
|
$form->select('store_id')->required()->options($storeList); |
||||
|
$form->text('name')->required()->maxLength(20); |
||||
|
$form->image('cover_img')->required(); |
||||
|
$form->number('sort'); |
||||
|
}); |
||||
|
$form->column(6, function (Form $form) { |
||||
|
$form->currency('price')->required()->floatTwo()->symbol('¥'); |
||||
|
$form->currency('original_price')->required()->floatTwo()->symbol('¥'); |
||||
|
$form->currency('vip_price')->required()->floatTwo()->symbol('¥'); |
||||
|
$form->text('goods_unit')->help('如:斤,个,盒,500克,1000克,1500克等'); |
||||
|
$form->radio('is_infinite')->options(['关闭','开启'])->default(1); |
||||
|
$form->number('inventory')->required()->attribute('min', 1)->default(1); |
||||
|
$form->number('restrict_num')->attribute('min', 0)->default(0)->help('0表示不限购'); |
||||
|
$form->number('start_num')->attribute('min', 1)->default(1); |
||||
|
}); |
||||
|
$form->column(12, function (Form $form) { |
||||
|
$form->hasMany('image_banners', function (Form\NestedForm $form) { |
||||
|
$form->image('path')->width(2); |
||||
|
$form->number('sort')->width(2)->default(0); |
||||
|
$form->hidden('type')->value(1)->default(1); |
||||
|
})->required(); |
||||
|
$form->divider(); |
||||
|
$form->hasMany('video_banners', function (Form\NestedForm $form) { |
||||
|
$form->file('path')->width(2); |
||||
|
$form->number('sort')->width(2)->default(0); |
||||
|
$form->hidden('type')->value(2)->default(2); |
||||
|
}); |
||||
|
$form->divider(); |
||||
|
|
||||
|
$form->multipleImage('details_imgs')->help('按图片顺序上传'); |
||||
|
$form->text('content')->maxLength(50); |
||||
|
$form->text('remark')->maxLength(50); |
||||
|
|
||||
|
$form->tags('tags','标签')->options(['新品','热销','新鲜']); |
||||
|
$form->table('spec', function (NestedForm $table) { |
||||
|
$table->text('spec_key')->help('如:净含量:500克,保质期:120天,包装:12个/盒等'); |
||||
|
$table->text('spec_value'); |
||||
|
}); |
||||
|
$form->switch('on_sale') |
||||
|
->customFormat(function ($v) { |
||||
|
return $v == '上架' ? 1 : 0; |
||||
|
}) |
||||
|
->saving(function ($v) { |
||||
|
return $v; |
||||
|
}); |
||||
|
|
||||
|
$form->disableResetButton(); |
||||
|
$form->disableViewCheck(); |
||||
|
$form->disableEditingCheck(); |
||||
|
$form->disableCreatingCheck(); |
||||
|
}); |
||||
|
$form->saved(function (Form $form){ |
||||
|
$storeId = $form->input('store_id'); |
||||
|
|
||||
|
// 商品所属市场,根据店铺查询市场
|
||||
|
$info = StoreModel::getStoreInfo($storeId,'market_id'); |
||||
|
$form->market_id = $info->market_id; |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Admin\Repositories\v3; |
||||
|
|
||||
|
use App\Models\v3\GoodsNew as Model; |
||||
|
use Dcat\Admin\Repositories\EloquentRepository; |
||||
|
|
||||
|
class GoodsNew extends EloquentRepository |
||||
|
{ |
||||
|
/** |
||||
|
* Model. |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $eloquentClass = Model::class; |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models\v3; |
||||
|
|
||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter; |
||||
|
use Illuminate\Database\Eloquent\SoftDeletes; |
||||
|
use Illuminate\Database\Eloquent\Model; |
||||
|
|
||||
|
class GoodsNew extends Model |
||||
|
{ |
||||
|
use HasDateTimeFormatter; |
||||
|
use SoftDeletes; |
||||
|
|
||||
|
protected $table = 'lanzu_goods_new'; |
||||
|
protected $dateFormat = 'U'; |
||||
|
/* 查询记录数 limit */ |
||||
|
protected $perPage = 10; |
||||
|
protected $appends = [ |
||||
|
'cover_img_url', |
||||
|
'on_sale_text', |
||||
|
'is_infinite_text' |
||||
|
]; |
||||
|
|
||||
|
protected $casts = [ |
||||
|
'details_imgs'=>'array', |
||||
|
'tags'=>'array', |
||||
|
'spec'=>'array', |
||||
|
]; |
||||
|
|
||||
|
public static $_onSale = ['否','是']; |
||||
|
public static $_isInfinite = ['关闭','开启']; |
||||
|
|
||||
|
public function getCoverImgUrlAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->cover_img; |
||||
|
return $this->imageUrl($value); |
||||
|
} |
||||
|
public function getOnSaleTextAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->on_sale; |
||||
|
return isset(self::$_onSale[$value]) ? self::$_onSale[$value] : ''; |
||||
|
} |
||||
|
public function getIsInfiniteTextAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->is_infinite; |
||||
|
return isset(self::$_isInfinite[$value]) ? self::$_isInfinite[$value] : ''; |
||||
|
} |
||||
|
public function ImageBanners(){ |
||||
|
return $this->hasMany('\App\Models\v3\GoodsBanners','goods_id','id')->where('type',1); |
||||
|
} |
||||
|
|
||||
|
public function VideoBanners(){ |
||||
|
return $this->hasMany('\App\Models\v3\GoodsBanners','goods_id','id')->where('type',2); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理旧图片 |
||||
|
* @param $value |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function imageUrl($value) |
||||
|
{ |
||||
|
if(strripos($value,"http") === false){ |
||||
|
return env('OSS_IMG_HOST').'/'.$value; |
||||
|
}else{ |
||||
|
return $value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models\v3; |
||||
|
|
||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter; |
||||
|
use Illuminate\Database\Eloquent\SoftDeletes; |
||||
|
use Illuminate\Database\Eloquent\Model; |
||||
|
|
||||
|
class GoodsNewBanners extends Model |
||||
|
{ |
||||
|
use HasDateTimeFormatter; |
||||
|
use SoftDeletes; |
||||
|
|
||||
|
protected $table = 'lanzu_goods_banners_new'; |
||||
|
protected $dateFormat = 'U'; |
||||
|
protected $fillable = ['path', 'id', 'goods_id','type','url']; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,115 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models\v3; |
||||
|
|
||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter; |
||||
|
use Illuminate\Database\Eloquent\SoftDeletes; |
||||
|
use Illuminate\Database\Eloquent\Model; |
||||
|
|
||||
|
class StoreNew extends Model |
||||
|
{ |
||||
|
use HasDateTimeFormatter; |
||||
|
use SoftDeletes; |
||||
|
|
||||
|
protected $table = 'lanzu_store_new'; |
||||
|
protected $dateFormat = 'U'; |
||||
|
|
||||
|
/* 查询记录数 limit */ |
||||
|
protected $perPage = 10; |
||||
|
|
||||
|
public static $_isRest= ['否','是']; |
||||
|
public static $_isOpen = ['关闭','开启']; |
||||
|
|
||||
|
protected $appends = [ |
||||
|
'logo_url', |
||||
|
'is_rest_text', |
||||
|
'is_open_text' |
||||
|
]; |
||||
|
|
||||
|
public function getLogoUrlAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->logo; |
||||
|
return $this->imageUrl($value); |
||||
|
} |
||||
|
|
||||
|
public function getIsRestTextAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->is_rest; |
||||
|
return isset(self::$_onRest[$value]) ? self::$_onRest[$value] : ''; |
||||
|
} |
||||
|
public function getIsOpenTextAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->is_iopen; |
||||
|
return isset(self::$_isOpen[$value]) ? self::$_isOpen[$value] : ''; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取商家环境图片 |
||||
|
* @param $value $this->environment |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function getEnvironmentAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : $this->environmant; |
||||
|
return $value ? explode(',',$value) : []; |
||||
|
} |
||||
|
public function setEnvironmentAttribute($value) |
||||
|
{ |
||||
|
$this->attributes['environment'] = implode(',',$value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 是否开启店铺 |
||||
|
*/ |
||||
|
public function getIsOpenAttribute($value) |
||||
|
{ |
||||
|
$value = $value ? $value : ''; |
||||
|
return $value ? explode(',',$value) : []; |
||||
|
} |
||||
|
public function setIsOpenAttribute($value) |
||||
|
{ |
||||
|
$this->attributes['is_open'] = 1; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取单个店铺信息 |
||||
|
* @param int $id |
||||
|
* @param string $field |
||||
|
* @return string |
||||
|
*/ |
||||
|
public static function getStoreInfo($id,$field = '*') |
||||
|
{ |
||||
|
return self::select($field)->find($id); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取店铺数组 |
||||
|
* id为键,name为值 |
||||
|
* @return array |
||||
|
*/ |
||||
|
public static function getStoreArray() |
||||
|
{ |
||||
|
$list = self::select('id','name') |
||||
|
->where('status',2) |
||||
|
->whereNull('deleted_at') |
||||
|
->get(); |
||||
|
$array = []; |
||||
|
if(count($list) > 0){ |
||||
|
foreach ($list as $value) { |
||||
|
$array[$value->id] = $value->name; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $array; |
||||
|
} |
||||
|
|
||||
|
// 处理图片
|
||||
|
public function imageUrl($value) |
||||
|
{ |
||||
|
if(strripos($value,"http") === false){ |
||||
|
return env('OSS_IMG_HOST').'/'.$value; |
||||
|
}else{ |
||||
|
return $value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
return [ |
||||
|
'labels' => [ |
||||
|
'GoodsNew' => '线上商品清洗', |
||||
|
'goods_new' => '线上商品清洗', |
||||
|
], |
||||
|
'fields' => [ |
||||
|
'name' => '商品名称', |
||||
|
'category_id' => '所属分类', |
||||
|
'goods_category_id' => '商品类目', |
||||
|
'store_id' => '所属商家', |
||||
|
'cover_img' => '封面图', |
||||
|
'cover_img_url' => '封面图', |
||||
|
'banners' => '轮播图', |
||||
|
|
||||
|
'price' => '售价', |
||||
|
'original_price' => '原价', |
||||
|
'vip_price' => '会员价', |
||||
|
'on_sale' => '是否上架', |
||||
|
'on_sale_text' => '是否上架', |
||||
|
'inventory' => '库存', |
||||
|
'content' => '简介', |
||||
|
'sort' => '排序', |
||||
|
'restrict_num' => '限购份数', |
||||
|
'start_num' => '起售份数', |
||||
|
'is_infinite' => '开启无限库存', |
||||
|
'is_infinite_text' => '开启无限库存', |
||||
|
'goods_unit' => '商品单位', |
||||
|
'tags' => '标签', |
||||
|
'details_imgs' => '详情图片', |
||||
|
'spec' => '规格', |
||||
|
'unit_number' => '单位前的数', |
||||
|
'remark' => '备注', |
||||
|
'spec_key' =>'规格名称', |
||||
|
'spec_value' => '规格参数', |
||||
|
'market_id' => '市场', |
||||
|
'image_banners' => '轮播图片', |
||||
|
'video_banners' => '轮播视频' |
||||
|
], |
||||
|
'options' => [ |
||||
|
], |
||||
|
]; |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue