diff --git a/MySQL_change.sql b/MySQL_change.sql index 24f35ce..ab1d0bb 100644 --- a/MySQL_change.sql +++ b/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`; diff --git a/app/AdminAgent/Controllers/AdvertisingController.php b/app/AdminAgent/Controllers/AdvertisingController.php index 3563779..4286d12 100644 --- a/app/AdminAgent/Controllers/AdvertisingController.php +++ b/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) { //不允许修改非自己的数据 diff --git a/app/AdminAgent/Controllers/SpecialController.php b/app/AdminAgent/Controllers/SpecialController.php index 8781c25..68978ec 100644 --- a/app/AdminAgent/Controllers/SpecialController.php +++ b/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("
", $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) { diff --git a/app/AdminAgent/Controllers/WaterfallAdController.php b/app/AdminAgent/Controllers/WaterfallAdController.php deleted file mode 100644 index fffd0cb..0000000 --- a/app/AdminAgent/Controllers/WaterfallAdController.php +++ /dev/null @@ -1,130 +0,0 @@ -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('格式如下:
产品详情页:/pages/goodsDetail/index?goods_id=产品ID -
文章详情页:/pages/notice/article?article_id=文章ID -
公告详情页:/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('数据不存在'); - } - }); - } -} diff --git a/app/AdminAgent/Repositories/WaterfallAd.php b/app/AdminAgent/Repositories/WaterfallAd.php deleted file mode 100644 index 20e0745..0000000 --- a/app/AdminAgent/Repositories/WaterfallAd.php +++ /dev/null @@ -1,16 +0,0 @@ -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]]); } diff --git a/app/Http/Controllers/Api/IndexController.php b/app/Http/Controllers/Api/IndexController.php index 9f6aef1..f7e5212 100644 --- a/app/Http/Controllers/Api/IndexController.php +++ b/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; } } diff --git a/app/Http/Controllers/Api/SpecialController.php b/app/Http/Controllers/Api/SpecialController.php index 681f4b2..73e0def 100644 --- a/app/Http/Controllers/Api/SpecialController.php +++ b/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() diff --git a/app/Models/WaterfallAd.php b/app/Models/WaterfallAd.php deleted file mode 100644 index 7299f03..0000000 --- a/app/Models/WaterfallAd.php +++ /dev/null @@ -1,18 +0,0 @@ -belongsTo(AgentProduct::class); - } -} diff --git a/resources/lang/zh_CN/advertising.php b/resources/lang/zh_CN/advertising.php new file mode 100644 index 0000000..9508def --- /dev/null +++ b/resources/lang/zh_CN/advertising.php @@ -0,0 +1,28 @@ + [ + 'Advertising' => '广告图', + 'advertising' => '广告图', + ], + 'fields' => [ + 'title' => '标题', + 'picture' => '图片地址', + 'status' => '状态', + 'agent_id' => '代理商ID', + 'sort' => '排序', + 'type' => '链接类型', + 'url' => '链接到', + 'display' => '显示位置', + ], + 'options' => [ + 'type' => [ + 0 => '内部页面', + 1 => '网址', + ], + 'display' => [ + 0 => '轮播图', + 1 => '首页横屏广告', + 2 => '产品列表内嵌广告', + ], + ], +]; diff --git a/resources/lang/zh_CN/slide.php b/resources/lang/zh_CN/slide.php deleted file mode 100644 index 46d7ed2..0000000 --- a/resources/lang/zh_CN/slide.php +++ /dev/null @@ -1,18 +0,0 @@ - [ - 'Slide' => '轮播图', - 'slide' => '轮播图', - ], - 'fields' => [ - 'title' => '图片说明', - 'picture' => '图片地址', - 'status' => '状态', - 'agent_id' => '代理商ID', - 'sort' => '排序', - 'type' => '链接类型', - 'url' => '链接到', - ], - 'options' => [ - ], -];