diff --git a/MySQL_change.sql b/MySQL_change.sql index f2ba995..c4775f8 100644 --- a/MySQL_change.sql +++ b/MySQL_change.sql @@ -85,7 +85,6 @@ ENGINE=InnoDB ALTER TABLE `agent_products` ADD COLUMN `stock` INT(10) NOT NULL DEFAULT '0' COMMENT '库存' AFTER `sale`; -################################################################# # 10:42 ‎2021/‎08/‎21 ALTER TABLE `orders` CHANGE COLUMN `order_no` `order_no` CHAR(22) NOT NULL COMMENT '订单号' COLLATE 'utf8_general_ci' AFTER `agent_id`; @@ -96,15 +95,20 @@ ALTER TABLE `orders` # 10:35 ‎2021/‎08/‎22 ALTER TABLE `slides` CHANGE COLUMN `url` `picture` VARCHAR(255) NOT NULL COMMENT '轮播图地址' COLLATE 'utf8_general_ci' AFTER `title`, - ADD COLUMN `type` TINYINT NOT NULL DEFAULT '0' COMMENT '链接类型,0:链接产品详情;1:链接到webview url' AFTER `sort`, + ADD COLUMN `type` TINYINT NOT NULL DEFAULT '0' COMMENT '链接类型,0:链接到内部页面;1:链接到webview url' AFTER `sort`, ADD COLUMN `url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '链接地址' AFTER `type`; +################################################################# # 23:43 ‎2021/‎08/‎22 CREATE TABLE `waterfall_ads` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `agent_id` INT(11) NOT NULL COMMENT '代理商ID', + `id` INT(10) NOT NULL AUTO_INCREMENT, + `agent_id` INT(10) NOT NULL COMMENT '代理商ID', + `title` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '广告名称' COLLATE 'utf8_general_ci', `picture` VARCHAR(255) NOT NULL COMMENT '广告图片' COLLATE 'utf8_general_ci', - `agent_product_id` INT(11) NOT NULL COMMENT '链接到产品', + `type` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '链接类型,0:链接到内部页面;1:链接到外部url', + `url` VARCHAR(50) NOT NULL COMMENT '链接' COLLATE 'utf8_general_ci', + `status` TINYINT(3) NOT NULL DEFAULT '1' COMMENT '0:未启用,1:启用', + `sort` SMALLINT(5) NOT NULL DEFAULT '255' COMMENT '排序,越小越靠前', `created_at` TIMESTAMP NULL DEFAULT NULL, `updated_at` TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, @@ -112,5 +116,4 @@ CREATE TABLE `waterfall_ads` ( ) COMMENT='瀑布流内嵌广告' COLLATE='utf8_general_ci' -ENGINE=InnoDB -; +ENGINE=InnoDB; diff --git a/app/AdminAgent/Controllers/WaterfallAdController.php b/app/AdminAgent/Controllers/WaterfallAdController.php index 6271d66..98b13bc 100644 --- a/app/AdminAgent/Controllers/WaterfallAdController.php +++ b/app/AdminAgent/Controllers/WaterfallAdController.php @@ -18,22 +18,23 @@ class WaterfallAdController extends AdminController */ protected function grid() { - return Grid::make(new WaterfallAd(), function (Grid $grid) { - $grid->disableFilterButton(); + 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->model()->where('agent_id', Admin::user()->id); + $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->column('id')->sortable(); - $grid->column('picture'); - $grid->column('agent_product_id'); - $grid->column('created_at'); - $grid->column('updated_at')->sortable(); - - $grid->filter(function (Grid\Filter $filter) { + $grid->filter(function (Grid\Filter $filter) { $filter->panel(); - $filter->equal('id'); - }); + $filter->equal('id'); + $filter->like('title'); + }); }); } @@ -46,15 +47,19 @@ class WaterfallAdController extends AdminController */ protected function detail($id) { - return Show::make($id, new WaterfallAd(), function (Show $show) { + 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('picture'); - $show->field('agent_product_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'); }); @@ -74,15 +79,47 @@ class WaterfallAdController extends AdminController } $form->display('id'); - $form->text('picture'); - $form->text('agent_product_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 ($form->model()[0]['agent_id'] != Admin::user()->id) { diff --git a/app/Http/Controllers/Api/AgentProductController.php b/app/Http/Controllers/Api/AgentProductController.php index 09b1ebf..d9d4ce1 100644 --- a/app/Http/Controllers/Api/AgentProductController.php +++ b/app/Http/Controllers/Api/AgentProductController.php @@ -5,6 +5,7 @@ use App\Common\ProductStatus; use App\Http\Controllers\Controller; use App\Models\AgentProduct; use App\Models\UserFav; +use App\Models\WaterfallAd; use Illuminate\Support\Facades\Storage; /** @@ -26,6 +27,7 @@ class AgentProductController extends Controller $list = AgentProduct::list()->where($where)->simplePaginate(); $list = $this->paginatePicAddHost($list); + $list = $this->insertAd($list); return $this->success($list); } @@ -99,4 +101,37 @@ class AgentProductController extends Controller } return $list; } + + //插入瀑布流广告 + private function insertAd($list) + { + //插入瀑布流广告,分别在第8个和第16个插入,同时需要考虑到分页。当所有瀑布流广告插入完之后,再次循环插入 + $list = $list->toArray(); + if ($list['data']) { + $ad_total = WaterfallAd::where(['agent_id' => $this->agent_id, 'status' => 1])->count(); + + $page = (int)request()->input('page'); + $start = ($page ? $page - 1 : 0) * 2 % $ad_total; + + $ad = WaterfallAd::where(['agent_id' => $this->agent_id, 'status' => 1]) + ->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); + if (!empty($list['data'][$temp - 1]) && !empty($ad[$k])) { + array_splice($list['data'], $temp + $k, 0, [$ad[$k]]); + } + } + } + return $list; + } } diff --git a/app/Models/WaterfallAd.php b/app/Models/WaterfallAd.php index 402321f..7299f03 100644 --- a/app/Models/WaterfallAd.php +++ b/app/Models/WaterfallAd.php @@ -10,5 +10,9 @@ class WaterfallAd extends Model { use HasDateTimeFormatter; protected $table = 'waterfall_ads'; - + + public function agentProduct() + { + return $this->belongsTo(AgentProduct::class); + } } diff --git a/resources/lang/zh_CN/waterfall-ad.php b/resources/lang/zh_CN/waterfall-ad.php index 68260bb..996e9d4 100644 --- a/resources/lang/zh_CN/waterfall-ad.php +++ b/resources/lang/zh_CN/waterfall-ad.php @@ -1,13 +1,17 @@ - [ 'WaterfallAd' => '产品列表内嵌广告', 'waterfall-ad' => '产品列表内嵌广告', ], 'fields' => [ + 'title' => '广告名称', 'agent_id' => '代理商ID', 'picture' => '广告图片', - 'agent_product_id' => '链接到产品', + 'type' => '链接', + 'url' => '链接地址', + 'sort' => '排序', + 'status' => '状态', ], 'options' => [ ],