Browse Source

瀑布流、轮播图、首页横屏广告统一保存在Advertisings表管理

dev
李可松 4 years ago
parent
commit
57f79c31d9
  1. 11
      MySQL_change.sql
  2. 25
      app/AdminAgent/Controllers/AdvertisingController.php
  3. 8
      app/AdminAgent/Controllers/SpecialController.php
  4. 130
      app/AdminAgent/Controllers/WaterfallAdController.php
  5. 16
      app/AdminAgent/Repositories/WaterfallAd.php
  6. 38
      app/Http/Controllers/Api/AgentProductController.php
  7. 18
      app/Http/Controllers/Api/IndexController.php
  8. 2
      app/Http/Controllers/Api/SpecialController.php
  9. 18
      app/Models/WaterfallAd.php
  10. 28
      resources/lang/zh_CN/advertising.php
  11. 18
      resources/lang/zh_CN/slide.php

11
MySQL_change.sql

@ -135,5 +135,16 @@ ALTER TABLE `slides`
COMMENT='广告图、轮播图等';
RENAME TABLE `slides` TO `advertisings`;
# 23:05 ‎2021/‎08/‎24
ALTER TABLE `advertisings`
CHANGE COLUMN `agent_id` `agent_id` INT(11) NOT NULL COMMENT '发布者ID' AFTER `id`,
ADD COLUMN `display` TINYINT NOT NULL DEFAULT 0 COMMENT '显示位置,0:轮播图;1:首页横屏广告;2:瀑布流内嵌广告;' AFTER `url`;
# 23:56 ‎2021/‎08/‎24
ALTER TABLE `agent_products`
ADD INDEX `sale` (`sale`),
ADD INDEX `category_id` (`category_id`);
# 0:24 ‎2021/‎08/‎25
ALTER TABLE `specials`
DROP COLUMN `picture_ad`;

25
app/AdminAgent/Controllers/AdvertisingController.php

@ -22,9 +22,10 @@ class AdvertisingController extends AdminController
$grid->model()->where('agent_id', Admin::user()->id)->orderBy('sort')->orderBy('id', 'DESC');
$grid->column('id')->sortable();
$grid->column('display')->using(admin_trans('advertising.options.display'));
$grid->column('title');
$grid->column('picture')->image('', 60, 60);
$grid->column('type')->using(['链接内部页面', '链接网址']);
$grid->column('type')->using(admin_trans('advertising.options.type'));
$grid->column('url');
$grid->column('status')->switch();
$grid->column('sort')->editable()->sortable()->width(120);
@ -33,6 +34,7 @@ class AdvertisingController extends AdminController
$filter->panel();
$filter->equal('id')->width(2);
$filter->equal('display')->select(admin_trans('advertising.options.display'))->width(2);
$filter->like('title')->width(3);
});
});
@ -54,9 +56,10 @@ class AdvertisingController extends AdminController
}
$show->field('id');
$show->field('display')->using(admin_trans('advertising.options.display'));
$show->field('title');
$show->field('picture')->image('', 80, 80);
$show->field('type')->using(['链接内部页面', '链接网址']);
$show->field('type')->using(admin_trans('advertising.options.type'));
$show->field('url');
$show->field('status')->using(['禁用', '启用']);
$show->field('sort');
@ -79,15 +82,22 @@ class AdvertisingController extends AdminController
}
$form->display('id');
$form->select('display')
->options(admin_trans('advertising.options.display'))
->default(0)
->required();
$form->text('title')
->help('主要用于后台显示,方便管理')
->required();
$form->image('picture')
->required()->removable(false)->uniqueName()
->help('图片大小:750*360');
$form->select('status')->options(['禁用', '启用'])->default(1)->required();
$form->radio('type', '链接类型')
->options(['链接到内部页面', '链接到网址'])
->help('轮播图大小:750*360;横屏广告大小:750*230;产品列表内嵌广告建议跟产品图片大小一致');
$form->select('status')
->options(['禁用', '启用'])
->default(1)
->required();
$form->radio('type', '链接类型')
->options(admin_trans('advertising.options.type'))
->value(0)->default(0)
->when(0, function (Form $form) {
$form->text('url-0', '内部页面地址')
@ -100,7 +110,8 @@ class AdvertisingController extends AdminController
$form->url('url-1', '链接到网址')
->placeholder('如:https://www.baidu.com/')
->customFormat(fn() => $this->type == 1 ? $this->url : '');
});
})
->required();
$form->text('sort')->default(255)->required();
})->saving(function (Form $form) {
//不允许修改非自己的数据

8
app/AdminAgent/Controllers/SpecialController.php

@ -28,7 +28,6 @@ class SpecialController extends AdminController
$grid->model()->where('agent_id', Admin::user()->id);
$grid->column('id')->sortable();
$grid->column('picture_ad')->image('', 60, 60);
$grid->column('agent_product_id', '专题产品')
->display('查看')
->modal(function ($modal) use ($grid) {
@ -48,7 +47,6 @@ class SpecialController extends AdminController
}
return Table::make(['产品ID', '标题', '图片', '销量', '库存'], $result);
});
$grid->column('sort');
$grid->column('created_at');
$grid->column('updated_at')->sortable();
@ -76,7 +74,6 @@ class SpecialController extends AdminController
}
$show->field('id');
$show->field('picture_ad')->image('', 80, 80);
$show->field('picture')->image('', 80, 80);
$show->field('agent_product_id', '产品')
->unescape()
@ -86,7 +83,6 @@ class SpecialController extends AdminController
->orderBy('id')->get(['id', 'product_id']);
return join("<br>", $data->map(fn($v) => $v->product->title)->toArray());
});
$show->field('sort');
$show->field('created_at');
$show->field('updated_at');
});
@ -106,9 +102,6 @@ class SpecialController extends AdminController
}
$form->display('id');
$form->image('picture_ad')
->required()->removable(false)->uniqueName()
->help('图片大小:750*230');
$form->multipleImage('picture')
->required()->removable(false)->uniqueName()
->help('图片大小:750*490');
@ -130,7 +123,6 @@ class SpecialController extends AdminController
})
->pluck('product.title')
->value(join(',', $form->model()->agent_product_id ?? []));
$form->text('sort')->default(255);
})->saving(function (Form $form) {
//不允许修改非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {

130
app/AdminAgent/Controllers/WaterfallAdController.php

@ -1,130 +0,0 @@
<?php
namespace App\AdminAgent\Controllers;
use App\AdminAgent\Repositories\WaterfallAd;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
class WaterfallAdController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new WaterfallAd('agentProduct.product:id,title'), function (Grid $grid) {
$grid->model()->where('agent_id', Admin::user()->id)->orderBy('sort')->orderBy('id', 'DESC');
$grid->column('id')->sortable();
$grid->column('title');
$grid->column('picture')->image('', 60, 60);
$grid->column('type')->using(['链接内部页面', '链接网址']);
$grid->column('url');
$grid->column('status')->switch();
$grid->column('sort')->editable()->sortable()->width(120);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('id')->width(2);
$filter->like('title')->width(3);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new WaterfallAd('agentProduct.product:id,title'), function (Show $show) {
//不允许查看非自己的数据
if ($show->model()->agent_id != Admin::user()->id) {
Admin::exit('数据不存在');
}
$show->field('id');
$show->field('title');
$show->field('picture')->image('', 80, 80);
$show->field('type')->using(['链接内部页面', '链接网址']);
$show->field('url');
$show->field('status')->using(['禁用', '启用']);
$show->field('sort');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new WaterfallAd(), function (Form $form) {
//不允许查看非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
$form->display('id');
$form->text('title')->required();
$form->image('picture')
->required()->removable(false)->uniqueName();
$form->radio('type', '链接类型')
->options(['链接到内部页面', '链接到网址'])
->value(0)->default(0)
->when(0, function (Form $form) {
$form->text('url-0', '内部页面地址')
->customFormat(fn() => $this->type == 0 ? $this->url : '')
->help('格式如下:<br>产品详情页:/pages/goodsDetail/index?goods_id=产品ID
<br>文章详情页:/pages/notice/article?article_id=文章ID
<br>公告详情页:/pages/notice/notice?notice_id=公告ID');
})
->when(1, function (Form $form) {
$form->url('url-1', '链接到网址')
->placeholder('如:https://www.baidu.com/')
->customFormat(fn() => $this->type == 1 ? $this->url : '');
});
$form->text('sort')->default(255)->required();
})->saving(function (Form $form) {
//不允许修改非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
//将null字段设置为空值,防止插入数据库出错
foreach ($form->input() as $k => $v) {
if (is_null($v)) {
$form->$k = '';
}
}
//处理特殊字段
$form->hidden(['agent_id', 'url']);
$form->agent_id = Admin::user()->id;
$form->status = $form->status ? 1 : 0;
$form->url = $form->{'url-' . $form->type};
$form->deleteInput(['url-0', 'url-1']);
//不允许编辑的字段
$form->ignore(['id', 'created_at', 'updated_at']);
})->deleting(function (Form $form) {
//不允许删除非自己的数据
if (array_filter($form->model()->toArray(), fn($v) => $v['agent_id'] != Admin::user()->id)) {
return $form->response()->error('数据不存在');
}
});
}
}

16
app/AdminAgent/Repositories/WaterfallAd.php

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

38
app/Http/Controllers/Api/AgentProductController.php

@ -3,9 +3,9 @@
namespace App\Http\Controllers\Api;
use App\Common\ProductStatus;
use App\Http\Controllers\Controller;
use App\Models\Advertising;
use App\Models\AgentProduct;
use App\Models\UserFav;
use App\Models\WaterfallAd;
use Illuminate\Support\Facades\Storage;
/**
@ -70,8 +70,15 @@ class AgentProductController extends Controller
// 猜你喜欢
public function guessLike()
{
// TODO 此处需要再优化排序规则,并增加广告功能
return $this->index();
$list = AgentProduct::list()->where('agent_id', $this->agent_id)->simplePaginate();
$list = $this->paginatePicAddHost($list);
$list = $list->toArray();
if (!empty($list['data']) && is_array($list['data'])) {
shuffle($list['data']); //随机乱序
}
$list = $this->insertAd($list);
return $this->success($list);
}
//【我的】页面下方推荐
@ -81,11 +88,14 @@ class AgentProductController extends Controller
return $this->index();
}
//人气爆款列表
//人气爆款列表,销量排序
public function hotList()
{
//TODO 具体排序规则,后期再做修改
return $this->index();
$list = AgentProduct::list()->where('agent_id', $this->agent_id)->simplePaginate();
$list = $this->paginatePicAddHost($list);
$list = $this->insertAd($list);
return $this->success($list);
}
//分页列表产品图片加域名
@ -106,27 +116,27 @@ class AgentProductController extends Controller
private function insertAd($list)
{
//插入瀑布流广告,分别在第8个和第16个插入,同时需要考虑到分页。当所有瀑布流广告插入完之后,再次循环插入
$list = $list->toArray();
if ($list['data']) {
$ad_total = WaterfallAd::where(['agent_id' => $this->agent_id, 'status' => 1])->count();
if (is_object($list) && method_exists($list, 'toArray')) {
$list = $list->toArray();
}
$ad_total = Advertising::where(['agent_id' => $this->agent_id, 'status' => 1, 'display' => 2])->count();
if ($list['data'] && $ad_total > 0) {
$page = (int)request()->input('page');
$start = ($page ? $page - 1 : 0) * 2 % $ad_total;
$ad = WaterfallAd::where(['agent_id' => $this->agent_id, 'status' => 1])
$ad = Advertising::where(['agent_id' => $this->agent_id, 'status' => 1, 'display' => 2])
->orderBy('sort')->orderBy('id', 'DESC')
->offset($start)->limit(2)->get(['title', 'picture', 'type', 'url'])->toArray();
$prefix = Storage::disk('public')->url('');
//每隔8个插入广告
$gap = 4;
foreach ($ad as $k => &$v) {
$v['is_ad'] = true;
$v['picture'] = $prefix . $v['picture'];
//插入广告
$temp = $gap * ($k+1);
//每隔8个插入广告
$temp = 8 * ($k+1);
if (!empty($list['data'][$temp - 1]) && !empty($ad[$k])) {
array_splice($list['data'], $temp + $k, 0, [$ad[$k]]);
}

18
app/Http/Controllers/Api/IndexController.php

@ -6,7 +6,6 @@ use App\Models\Channel;
use App\Models\Notice;
use App\Models\AgentProduct;
use App\Models\Advertising;
use App\Models\Special;
use App\Models\UserChannel;
use Illuminate\Support\Facades\Storage;
@ -23,11 +22,13 @@ class IndexController extends Controller
$img_prefix = Storage::disk('public')->url('');
# 轮播图
$slide = Advertising::where(['agent_id' => $this->agent_id, 'status' => 1])
$slide = Advertising::where(['agent_id' => $this->agent_id, 'status' => 1, 'display' => 0])
->orderBy('sort')->orderBy('id', 'DESC')->limit(10)
->get(['title', 'picture', 'type', 'url']);
foreach ($slide as &$v) {
$v->picture = $img_prefix . $v->picture;
if (!$slide->isEmpty()) {
foreach ($slide as &$v) {
$v->picture = $img_prefix . $v->picture;
}
}
# 公告
@ -71,13 +72,12 @@ class IndexController extends Controller
}
# 专题列表
$special = Special::query()
->where('agent_id', $this->agent_id)
->orderBy('sort')->orderBy('id')
->limit(6)->get(['id', 'picture_ad']);
$special = Advertising::where('agent_id', $this->agent_id)
->orderBy('sort')->orderBy('id', 'desc')->limit(6)
->get(['title', 'picture', 'type', 'url']);
if (!$special->isEmpty()) {
foreach ($special as $k=>&$v) {
$v->picture_ad = $img_prefix . $v->picture_ad;
$v->picture = $img_prefix . $v->picture;
}
}

2
app/Http/Controllers/Api/SpecialController.php

@ -12,7 +12,7 @@ class SpecialController extends Controller
{
$id = (int)request()->input('id');
$detail = Special::query()
->select(['id', 'picture', 'picture_ad', 'updated_at', 'agent_product_id'])
->select(['id', 'picture', 'updated_at', 'agent_product_id'])
->find($id);
$detail->product = AgentProduct::list()

18
app/Models/WaterfallAd.php

@ -1,18 +0,0 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
class WaterfallAd extends Model
{
use HasDateTimeFormatter;
protected $table = 'waterfall_ads';
public function agentProduct()
{
return $this->belongsTo(AgentProduct::class);
}
}

28
resources/lang/zh_CN/advertising.php

@ -0,0 +1,28 @@
<?php
return [
'labels' => [
'Advertising' => '广告图',
'advertising' => '广告图',
],
'fields' => [
'title' => '标题',
'picture' => '图片地址',
'status' => '状态',
'agent_id' => '代理商ID',
'sort' => '排序',
'type' => '链接类型',
'url' => '链接到',
'display' => '显示位置',
],
'options' => [
'type' => [
0 => '内部页面',
1 => '网址',
],
'display' => [
0 => '轮播图',
1 => '首页横屏广告',
2 => '产品列表内嵌广告',
],
],
];

18
resources/lang/zh_CN/slide.php

@ -1,18 +0,0 @@
<?php
return [
'labels' => [
'Slide' => '轮播图',
'slide' => '轮播图',
],
'fields' => [
'title' => '图片说明',
'picture' => '图片地址',
'status' => '状态',
'agent_id' => '代理商ID',
'sort' => '排序',
'type' => '链接类型',
'url' => '链接到',
],
'options' => [
],
];
Loading…
Cancel
Save