Browse Source

添加活动商品,分类绑定到首页加排序

master
liangyuyan 5 years ago
parent
commit
09f83f808c
  1. 6
      app/Admin/Controllers/v3/CategoryController.php
  2. 195
      app/Admin/Controllers/v3/GoodsActivityController.php
  3. 4
      app/Admin/Controllers/v3/GoodsController.php
  4. 5
      app/Admin/Forms/CategoryTieForm.php
  5. 16
      app/Admin/Repositories/v3/GoodsActivity.php
  6. 1
      app/Admin/routes.php
  7. 90
      app/Models/v3/GoodsActivity.php
  8. 18
      app/Models/v3/GoodsActivityBanners.php
  9. 2
      database/migrations/2020_09_01_095556_create_lanzu_goods_table.php
  10. 58
      database/migrations/2020_09_05_151852_create_lanzu_goods_activity_table.php
  11. 460
      dcat_admin_ide_helper.php
  12. 44
      resources/lang/zh-CN/goods-activity.php
  13. 5
      resources/lang/zh-CN/goods.php

6
app/Admin/Controllers/v3/CategoryController.php

@ -32,7 +32,7 @@ class CategoryController extends AdminController
$logo = "<img src='$src' style='margin-left: 20px; max-width:35px;max-height:35px' class='img'/>";
$actions = '';
$actions = (in_array($branch['id'],$select)) ?'<span style="margin-left: 20px;color: #dda451;">在首页显示</span>':$actions;
$actions = (in_array($branch['id'],$select)) ?'<span style="margin-left: 20px;color: #dda451;">在首页显示'.'【'.$branch['sort'].'】</span>' :$actions;
return "{$branch['id']} - {$branch['title']} $logo $actions ";
});
@ -52,8 +52,8 @@ class CategoryController extends AdminController
$parentList = Category::getCategoryArray([['parent_id','=',0]],[0=>'顶级']);
$form->select('parent_id')->default(0)->options($parentList);
$form->text('title');
$form->image('cover_img');
$form->text('title')->required();
$form->image('cover_img')->required();
$form->number('sort');

195
app/Admin/Controllers/v3/GoodsActivityController.php

@ -0,0 +1,195 @@
<?php
namespace App\Admin\Controllers\v3;
use App\Admin\Repositories\v3\GoodsActivity;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Controllers\AdminController;
use App\Models\v3\Market as MarketModel;
use App\Models\v3\Store as StoreModel;
use App\Models\v3\Category as CategoryModel;
use App\Models\v3\GoodsActivity as GoodsActivityModel;
use Dcat\Admin\Form\NestedForm;
class GoodsActivityController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new GoodsActivity(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('cover_img')->image('',50);
$grid->column('name');
$grid->column('price');
$grid->column('type_text');
$grid->column('market_id')->display(function($marketId){
$item = MarketModel::getMarketInfo($marketId,'name');
return empty($item) ? '' : $item->name;
});
$grid->column('store_id')->display(function($storeId){
$item = StoreModel::getStoreInfo($storeId,'name');
return empty($item) ? '' : $item->name;
});
$grid->column('category_id')->display(function($categoryId){
$item = CategoryModel::getCategoryInfo($categoryId,'title');
return empty($item) ? '' : $item->title;
});
$grid->column('expire_time_text');
$grid->column('sort');
$grid->column('on_sale')->switch();
$grid->model()->orderby('id','desc');
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
// 每页10条
$grid->paginate(10);
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new GoodsActivity(), function (Show $show) {
$show->row(function (Show\Row $show) {
$show->width(6)->field('id');
$show->width(6)->field('name');
$show->width(6)->field('cover_img')->image();
$show->width(6)->field('goods_unit');
$show->width(6)->field('price');
$show->width(6)->field('original_price');
$show->width(6)->field('vip_price');
$show->width(6)->field('start_num');
$show->width(6)->field('restrict_num');
$show->width(6)->field('is_infinite');
$show->width(6)->field('inventory');
$show->width(6)->field('type_text');
$show->width(6)->field('goods_id');
$show->width(6)->field('market_id');
$show->width(6)->field('store_id');
$show->width(6)->field('category_id');
$show->width(6)->field('on_sale');
$show->width(6)->field('sort');
});
$show->row(function (Show\Row $show) {
$show->width(6)->field('content');
$show->width(6)->field('expire_time_text');
$show->width(6)->field('time_limit_days');
$show->width(6)->field('time_limit_num');
$show->width(6)->field('can_use_coupon_text');
$show->width(6)->field('tags')->as(function ($value){
return $value;
});
$show->width(6)->field('spec')->as(function ($value){
$text = '';
foreach ($value as $v){
$text .= '【'.$v['spec_key'] .':'.$v['spec_value'].'】 ';
}
return $text;
});
// $show->width(6)->field('details_imgs');
$show->width(6)->field('remark');
$show->width(6)->field('created_at');
$show->width(6)->field('updated_at');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$builder = GoodsActivityModel::with(['ImageBanners','VideoBanners']);
return Form::make($builder, function (Form $form) {
$form->hidden('id');
// 二级分类
$categoryList = CategoryModel::getCategoryArray([['parent_id','>',0]]);
// 店铺
$storeList = StoreModel::getStoreArray();
//市场
$marketList = MarketModel::getMarket();
$form->column(6, function (Form $form) use($marketList,$storeList,$categoryList ){
$form->text('goods_id');
$form->select('market_id')->required()->options($marketList);
$form->select('category_id')->required()->options($categoryList);
$form->select('store_id')->required()->options($storeList);
$form->text('name')->required()->maxLength(20);
$form->image('cover_img')->required();
$form->select('type')->options(GoodsActivityModel::$_type)->default('flash_sale');
$form->datetime('expire_time')->value($form->model()->expire_time_text);
$form->number('time_limit_days');
});
$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->number('time_limit_num');
$form->switch('can_use_coupon');
});
$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();
});
});
}
}

4
app/Admin/Controllers/v3/GoodsController.php

@ -78,7 +78,7 @@ class GoodsController extends AdminController
$show->width(6)->original_price;
$show->width(6)->vip_price;
$show->width(6)->inventory;
$show->width(6)->good_unit;
$show->width(6)->goods_unit;
});
$show->row(function (Show\Row $show) {
@ -152,7 +152,7 @@ class GoodsController extends AdminController
$form->currency('price')->required()->floatTwo()->symbol('¥');
$form->currency('original_price')->required()->floatTwo()->symbol('¥');
$form->currency('vip_price')->required()->floatTwo()->symbol('¥');
$form->text('good_unit')->help('如:斤,个,盒,500克,1000克,1500克等');
$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表示不限购');

5
app/Admin/Forms/CategoryTieForm.php

@ -22,13 +22,14 @@ class CategoryTieForm extends Form
public function handle(array $input)
{
$ids = $input['category_ids'];
$category = CategoryModel::select('id','title','cover_img')->whereIn('id',$ids)->get();
$category = CategoryModel::select('id','title','cover_img','sort')->whereIn('id',$ids)->get();
$data = [];
if(!empty($category)){
foreach ($category as $key => $value){
$data[$value->id] = json_encode([
'icon' => $value->cover_img,
'name' => $value->title
'name' => $value->title,
'sort' => $value->sort
]);
}
if(count($data) > 0){

16
app/Admin/Repositories/v3/GoodsActivity.php

@ -0,0 +1,16 @@
<?php
namespace App\Admin\Repositories\v3;
use App\Models\v3\GoodsActivity as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class GoodsActivity extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

1
app/Admin/routes.php

@ -52,6 +52,7 @@ Route::group([
$router->resource('/store', 'v3\StoreController');
// 商品
$router->resource('/goods', 'v3\GoodsController');
$router->resource('/goods_activity', 'v3\GoodsActivityController');
// banner
$router->resource('/banners', 'v3\BannersController');
$router->any('/test', 'Test@test');

90
app/Models/v3/GoodsActivity.php

@ -0,0 +1,90 @@
<?php
namespace App\Models\v3;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
class GoodsActivity extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'lanzu_goods_activity';
protected $dateFormat = 'U';
protected $appends = [
'cover_img_url',
'on_sale_text',
'is_infinite_text',
'can_use_coupon_text',
'expire_time_text'
];
protected $casts = [
'details_imgs'=>'array',
'tags'=>'array',
'spec'=>'array',
];
public static $_type = ['flash_sale'=>'秒杀','group_buy'=>'团购','new_product'=>'新品'];
public static $_onSale = ['否','是'];
public static $_isInfinite = ['关闭','开启'];
public static $_canUseCoupon = ['否','是'];
public function getCoverImgUrlAttribute($value)
{
$value = $value ? $value : $this->cover_img;
return $this->imageUrl($value);
}
public function getTypeTextAttribute($value)
{
$value = $value ? $value : $this->type;
return isset(self::$_isInfinite[$value]) ? self::$_isInfinite[$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 getCanUseCouponTextAttribute($value)
{
$value = $value ? $value : $this->can_use_coupon;
return isset(self::$_isInfinite[$value]) ? self::$_isInfinite[$value] : '';
}
public function getExpireTimeTextAttribute()
{
$value = $this->expire_time;
return empty($value) ? '' : date('Y-m-d H:i:s',$value);
}
public function ImageBanners(){
return $this->hasMany('\App\Models\v3\GoodsActivityBanners','goods_id','id')->where('type',1);
}
public function VideoBanners(){
return $this->hasMany('\App\Models\v3\GoodsActivityBanners','goods_id','id')->where('type',2);
}
public function setExpireTimeAttribute($value){
$this->attributes['expire_time'] = strtotime($value);
}
/**
* 处理旧图片
* @param $value
* @return string
*/
public function imageUrl($value)
{
if(strripos($value,"http") === false){
return env('OSS_IMG_HOST').'/'.$value;
}else{
return $value;
}
}
}

18
app/Models/v3/GoodsActivityBanners.php

@ -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 GoodsActivityBanners extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'lanzu_goods_activity_banners';
protected $dateFormat = 'U';
protected $fillable = ['path', 'id', 'goods_id','type','url'];
}

2
database/migrations/2020_09_01_095556_create_lanzu_goods_table.php

@ -29,7 +29,7 @@ class CreateLanzuGoodsTable extends Migration
$table->integer('restrict_num')->comment('限购份数');
$table->integer('start_num')->comment('起售份数');
$table->integer('is_infinite')->default('1')->comment('是否开启无限库存');
$table->string('good_unit')->nullable()->comment('商品单位');
$table->string('goods_unit')->nullable()->comment('商品单位');
$table->json('tags')->nullable()->comment('标签');
$table->json('details_imgs')->nullable()->comment('详情图片');
$table->json('spec')->nullable()->comment('规格');

58
database/migrations/2020_09_05_151852_create_lanzu_goods_activity_table.php

@ -0,0 +1,58 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLanzuGoodsActivityTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('lanzu_goods_activity', function (Blueprint $table) {
$table->increments('id');
$table->enum('type')->default('flash_sale')->nullable()->comment('活动类型');
$table->bigInteger('goods_id')->nullable()->comment('原始商品');
$table->integer('market_id')->comment('市场');
$table->bigInteger('store_id')->default('0')->comment('商家');
$table->integer('category_id')->default('0')->comment('分类');
$table->tinyInteger('on_sale')->default('1')->comment('是否上架');
$table->integer('sort')->default('0')->comment('排序');
$table->decimal('price')->comment('售价');
$table->decimal('original_price')->comment('原价');
$table->decimal('vip_price')->comment('会员价');
$table->integer('start_num')->default('1')->comment('起售份数');
$table->integer('restrict_num')->default('0')->comment('限购份数');
$table->tinyInteger('is_infinite')->default('1')->comment('是否开启无限库存');
$table->integer('inventory')->default('0')->comment('库存');
$table->string('name')->default('')->comment('商品名称');
$table->string('cover_img')->nullable()->comment('封面图');
$table->string('goods_unit')->nullable()->comment('商品单位');
$table->json('tags')->nullable()->comment('标签');
$table->json('details_imgs')->nullable()->comment('商品详情图片');
$table->json('spec')->nullable()->comment('规格');
$table->string('content')->nullable()->comment('简介');
$table->string('remark')->nullable()->comment('备注');
$table->integer('expire_time')->default('0')->nullable()->comment('活动结束时间时间戳');
$table->integer('time_limit_days')->default('1')->nullable()->comment('限制的天数');
$table->integer('time_limit_num')->default('1')->nullable()->comment('某天数下购买的数量');
$table->tinyInteger('can_use_coupon')->default('0')->nullable()->comment('是否可以使用优惠券');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('lanzu_goods_activity');
}
}

460
dcat_admin_ide_helper.php
File diff suppressed because it is too large
View File

44
resources/lang/zh-CN/goods-activity.php

@ -0,0 +1,44 @@
<?php
return [
'labels' => [
'GoodsActivity' => '活动商品',
'goodsActivity' => '活动商品',
'goods_activity' => '活动商品',
],
'fields' => [
'type' => '活动类型',
'type_text' => '活动类型',
'goods_id' => '原始商品',
'market_id' => '市场',
'store_id' => '商家',
'category_id' => '分类',
'on_sale' => '是否上架',
'sort' => '排序',
'price' => '售价',
'original_price' => '原价',
'vip_price' => '会员价',
'start_num' => '起售份数',
'restrict_num' => '限购份数',
'is_infinite' => '是否开启无限库存',
'inventory' => '库存',
'name' => '商品名称',
'cover_img' => '封面图',
'goods_unit' => '商品单位',
'tags' => '标签',
'details_imgs' => '商品详情图片',
'spec' => '规格',
'content' => '简介',
'remark' => '备注',
'expire_time' => '活动结束时间',
'time_limit_days' => '限制的天数',
'time_limit_num' => '限制购买数量',
'can_use_coupon' => '可同时使用优惠券',
'can_use_coupon_text' => '可同时使用优惠券',
'image_banners' => '轮播图片',
'video_banners' => '轮播视频',
'spec_key' =>'规格名称',
'spec_value' => '规格参数',
],
'options' => [
],
];

5
resources/lang/zh-CN/goods.php

@ -11,8 +11,7 @@ return [
'cover_img' => '封面图',
'cover_img_url' => '封面图',
'banners' => '轮播图',
'banner_imgs' => '轮播图',
'banner_video' => '轮播图中的短视频',
'price' => '售价',
'original_price' => '原价',
'vip_price' => '会员价',
@ -25,7 +24,7 @@ return [
'start_num' => '起售份数',
'is_infinite' => '开启无限库存',
'is_infinite_text' => '开启无限库存',
'good_unit' => '商品单位',
'goods_unit' => '商品单位',
'tags' => '标签',
'details_imgs' => '详情图片',
'spec' => '规格',

Loading…
Cancel
Save