Browse Source

取消频道功能,改为分类设置频道

master
李可松 4 years ago
parent
commit
b0d1350243
  1. 23
      app/Admin/Extensions/Grid/AuditAgent.php
  2. 12
      app/AdminAgent/Controllers/AgentProductController.php
  3. 127
      app/AdminAgent/Controllers/ChannelController.php
  4. 16
      app/AdminAgent/Repositories/Channel.php
  5. 1
      app/AdminAgent/routes.php
  6. 22
      app/AdminGuide/Controllers/MyDemandProductController.php
  7. 25
      app/Http/Controllers/Api/CategoryController.php
  8. 66
      app/Http/Controllers/Api/ChannelController.php
  9. 22
      app/Http/Controllers/Api/IndexController.php
  10. 36
      app/Http/Controllers/Api/UserCategoryController.php
  11. 35
      app/Http/Controllers/Api/UserChannelController.php
  12. 5
      app/Models/AgentProduct.php
  13. 34
      app/Models/Channel.php
  14. 13
      app/Models/UserCategory.php
  15. 26
      app/Models/UserChannel.php
  16. 16
      resources/lang/zh_CN/channel.php
  17. 7
      routes/api.php

23
app/Admin/Extensions/Grid/AuditAgent.php

@ -5,9 +5,7 @@ use App\Common\AgentType;
use App\Common\UserStatus;
use App\Models\Agent;
use App\Models\Category;
use App\Models\Channel;
use App\Models\Advertising;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid\RowAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@ -74,27 +72,6 @@ class AuditAgent extends RowAction
])->increment('pid', $id_interval);
}
//代理商频道列表
if (!Channel::withTrashed()->where('agent_id', $id)->first()) {
$default_channel = Channel::where('agent_id', 0)->orderBy('id')->get()->toArray();
$default_channel = array_map(function ($v) use ($id, $host) {
unset($v['id']);
$v['agent_id'] = $id;
//insert和update,increment等批量更新时,不支持修改器,需要手动处理
$v['icon'] = str_replace($host, '', $v['icon']);
return $v;
}, $default_channel);
Channel::insert($default_channel);
//获取ID间隔,更新pid
$id_interval = Channel::max('id') - count($default_channel);
Channel::where([
['agent_id', '=', $id],
['pid', '<>', 0],
])->increment('pid', $id_interval);
}
//首页轮播图
if (!Advertising::where('agent_id', $id)->first()) {
$default_slide = Advertising::where('agent_id', 0)->orderBy('id')->get()->toArray();

12
app/AdminAgent/Controllers/AgentProductController.php

@ -11,7 +11,6 @@ use App\Common\ProductStatus;
use App\Models\AgentProductItem;
use App\Models\AgentProductSpec;
use App\Models\Category;
use App\Models\Channel;
use App\Models\DiyForm;
use App\Models\Guide;
use App\Models\Product;
@ -74,13 +73,6 @@ class AgentProductController extends AdminController
$grid->column('sale');
$grid->column('stock');
$channels = Channel::where('agent_id', $agent_id)->pluck('name', 'id')->toArray();
$grid->column('channel_id', '频道')
->display(function ($modal) use ($channels) {
$data = array_flip(explode(',', $this->channel_id));
return join(',',array_intersect_key($channels, $data));
})
->limit(10);
$grid->column('category.name', '分类');
/*$grid->column('product_ids', '产品详情')
->display('查看')
@ -172,7 +164,6 @@ class AgentProductController extends AdminController
$show->field('content')->unescape();
if (Admin::user()->type != AgentType::OPERATOR) {
$show->field('is_rec')->using(['未推荐', '已推荐']);
$show->field('channel_id')->as(fn($v) => join(',', Channel::whereIn('id', explode(',', $v))->pluck('name')->toArray()));
$show->field('earnest');
$show->field('earnest_timeout');
$show->field('deposit');
@ -314,9 +305,6 @@ class AgentProductController extends AdminController
} else {
$form->switch('is_rec')->help('推荐后将在小程序“我的”页面下方显示');
$options = Channel::selectOptions(fn($query) => $query->where('agent_id', $agent_id));
$form->multipleSelect('channel_id')->options(array_slice($options, 1, null, true));
$form->decimal('earnest')->rules('required|numeric|min:0',[
'*' => '金额为必填字段且必须大于0',
])->default(0);

127
app/AdminAgent/Controllers/ChannelController.php

@ -1,127 +0,0 @@
<?php
namespace App\AdminAgent\Controllers;
use App\AdminAgent\Repositories\Channel;
use App\Models\Channel as ChannelModel;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Tree;
use Illuminate\Support\Facades\Storage;
class ChannelController extends AdminController
{
public function index(Content $content)
{
return $content->header('产品频道')
->body(function (Row $row) {
$tree = new Tree(new ChannelModel());
$tree->query(function ($model) {
//agent_id为0是系统分类,其它是代理商分类
return $model->where('agent_id', Admin::user()->id)->orderBy('sort')->orderBy('id');
});
/*$prefix = Storage::disk('public')->url('');
$tree->branch(function ($branch) use ($prefix) {
$src = $prefix . $branch['icon'] ;
$logo = '<img data-action="preview-img" src="'.$src.'" style="max-width:30px;max-height:30px;cursor:pointer;margin-left:20px;" class="img">';
return "{$branch['id']} - {$branch['name']} $logo";
});*/
$row->column(12, $tree);
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Channel(['parent']), function (Grid $grid) {
$grid->model()->where('agent_id', Admin::user()->id)
->orderBy('sort')->orderBy('id', 'desc');
$grid->column('id')->sortable();
$grid->column('icon')->image('', 60, 60);
$grid->column('name');
$grid->column('parent.name');
$grid->column('sort')->editable()->width(120);
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('id')->width(2);
$filter->like('name')->width(3);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new Channel(['parent']), function (Show $show) {
//不允许查看非自己的数据
if ($show->model()->agent_id != Admin::user()->id) {
Admin::exit('数据不存在');
}
$show->field('id');
$show->field('icon')->image('', 80, 80);
$show->field('name');
$show->field('parent.name');
$show->field('sort');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Channel(), function (Form $form) {
//不允许修改非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
$form->display('id');
$form->image('icon')->uniqueName()->removable(false);
$form->text('name')->required();
$form->select('pid')->options(\App\Models\Channel::selectOptions())->default(0)->required();
$form->text('sort')->default(255);
})->saving(function (Form $form) {
//不允许修改非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
//处理特殊字段
$form->hidden(['agent_id']);
$form->agent_id = Admin::user()->id;
$form->sort = $form->sort ?? 255;
//不允许编辑的字段
$form->ignore(['id', 'deleted_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/Channel.php

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

1
app/AdminAgent/routes.php

@ -39,7 +39,6 @@ Route::group([
$router->resource('supplier/list', 'SupplierController');
$router->resource('article/list', 'ArticleController');
$router->resource('setting', 'SettingController');
$router->resource('channel/list', 'ChannelController');
$router->resource('group_order/list', 'GroupOrderController');
$router->resource('finance_statistics', 'FinanceStatisticsController');
$router->resource('order_statistics', 'OrderStatisticsController');

22
app/AdminGuide/Controllers/MyDemandProductController.php

@ -2,25 +2,12 @@
namespace App\AdminGuide\Controllers;
use App\Common\ProductStatus;
use App\Models\AgentProduct;
use App\Models\Channel;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminGuide\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class MyDemandProductController extends AdminController
{
@ -52,15 +39,6 @@ class MyDemandProductController extends AdminController
$grid->column('agentProduct.sale','产品销量');
$grid->column('agentProduct.stock','产品库存');
$grid->column('channel_id', '频道')
->display(function ($modal) {
$channels = Channel::where('agent_id', $this->publisher_id)->pluck('name', 'id')->toArray();
$data = array_flip(explode(',', $this->channel_id));
return join(',',array_intersect_key($channels, $data));
})
->limit(10);
$grid->column('agentProduct.category.name', '分类');
$grid->disableDeleteButton();
$grid->disableEditButton();

25
app/Http/Controllers/Api/CategoryController.php

@ -5,10 +5,12 @@ use App\Common\ProductStatus;
use App\Http\Controllers\Controller;
use App\Models\AgentProduct;
use App\Models\Category;
use Illuminate\Http\JsonResponse;
class CategoryController extends Controller
{
public function index()
# 推荐页分类列表
public function index(): JsonResponse
{
$list = Category::query()
->where('agent_id', $this->agent_id)
@ -21,4 +23,25 @@ class CategoryController extends Controller
}
return $this->success($list);
}
# 首页频道获取的分类列表(无论分类有几级都只显示两级)
public function index_channel(): JsonResponse
{
$list = Category::query()
->where('agent_id', $this->agent_id)
->orderBy('sort')
->get(['id', 'name', 'pid'])->toArray();
$list = array_column($list, null, 'id');
foreach ($list as &$v) {
if ($v['pid'] == 0) continue;
$parent_pid = $list[$v['pid']]['pid'];
while ($parent_pid != 0) {
$v['pid'] = $parent_pid;
$parent_pid = $list[$parent_pid]['pid'];
}
}
return $this->success($list);
}
}

66
app/Http/Controllers/Api/ChannelController.php

@ -1,66 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\AgentProduct;
use App\Models\Channel;
use App\Models\UserChannel;
use Illuminate\Support\Facades\Storage;
/**
* 频道列表
* Class Channel
* @package App\Http\Controllers\Api
*/
class ChannelController extends Controller
{
// 所有频道列表
public function index()
{
$list = Channel::query()
->where('agent_id', $this->agent_id)
->orderBy('sort')
->orderBy('id')
->get(['id', 'pid', 'name', 'icon']);
$prefix = Storage::disk('public')->url('');
foreach ($list as $k => &$v) {
$v->icon = $prefix . $v->icon;
}
return $this->success($list);
}
// 我的频道
public function my()
{
$channel_ids = UserChannel::where('user_id', $this->user_id)->value('channels');
$list = Channel::whereIn('id', $channel_ids)->get(['id', 'pid', 'name', 'icon']);
return $this->success($list);
}
//根据频道ID获取产品
public function product()
{
$channel_id = (int)request()->input('channel_id');
$list = AgentProduct::list($this->agent_id)
->whereRaw("FIND_IN_SET($channel_id, `channel_id`)")
->orderBy('id', 'DESC')
->simplePaginate();
$list = $this->paginatePicAddHost($list);
return $this->success($list);
}
//分页列表产品图片加域名
private function paginatePicAddHost($list)
{
if (!$list->isEmpty()) {
$prefix = Storage::disk('public')->url('');
foreach ($list->items() as $k=>&$v) {
$v->pictures = array_map(function($item) use ($prefix) {
return strpos($item, $prefix) === false ? $prefix . $item : $item;
}, $v->pictures);
}
}
return $list;
}
}

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

@ -2,11 +2,11 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Channel;
use App\Models\Category;
use App\Models\Notice;
use App\Models\AgentProduct;
use App\Models\Advertising;
use App\Models\UserChannel;
use App\Models\UserCategory;
use Illuminate\Support\Facades\Storage;
/**
@ -36,18 +36,12 @@ class IndexController extends Controller
->orderBy('sort')->orderBy('id', 'desc')->get(['id', 'title']);
# 我的频道
$my_channels = [];
$my_cats = [];
if ($this->user_id) {
$channel_ids = UserChannel::where('user_id', $this->user_id)->value('channels') ?? [];
$my_channels = Channel::where('agent_id', $this->agent_id)
->whereIn('id', $channel_ids)
->get(['id', 'name', 'icon']);
}
if ($my_channels && !$my_channels->isEmpty()) {
foreach ($my_channels as &$v) {
$v->icon = $img_prefix . $v->icon;
}
$cate_ids = UserCategory::where('user_id', $this->user_id)->value('categories') ?? [];
$my_cats = Category::where('agent_id', $this->agent_id)
->whereIn('id', $cate_ids)
->get(['id', 'name']);
}
# 专题列表
@ -77,7 +71,7 @@ class IndexController extends Controller
return $this->success([
'slide' => $slide,
'notice' => $notice,
'my_channels' => $my_channels,
'my_channels' => $my_cats,
'special' => $special,
'hots' => $hots,
]);

36
app/Http/Controllers/Api/UserCategoryController.php

@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\UserCategory;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserCategoryController extends Controller
{
# 我的频道列表
public function index(): JsonResponse
{
return $this->success(UserCategory::where('user_id', $this->user_id)->value('categories') ?? []);
}
# 我的频道编辑
public function update(Request $request): JsonResponse
{
$formData = $request->only(['channels']);
$request->validate([
'channels' => 'nullable|array',
], [
'channels.array' => 'channels必须是数组',
]);
$cats = array_unique(array_filter($formData['channels'] ?? []));
UserCategory::updateOrCreate(['user_id' => $this->user_id], [
'user_id' => $this->user_id,
'categories' => $cats,
]);
return $this->success();
}
}

35
app/Http/Controllers/Api/UserChannelController.php

@ -1,35 +0,0 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\UserChannel;
use Illuminate\Http\Request;
class UserChannelController extends Controller
{
//我的频道列表
public function index()
{
$channels = UserChannel::where('user_id', $this->user_id)->value('channels');
return $this->success($channels);
}
// 我的频道编辑
public function update(Request $request)
{
$formData = $request->only(['channels']);
$request->validate([
'channels' => 'nullable|array',
], [
'channels.array' => 'channels必须是数组',
]);
$channels = array_unique(array_filter($formData['channels']));
$UserChannel = UserChannel::where('user_id', $this->user_id)->first();
$UserChannel->channels = $channels;
$UserChannel->save();
return $this->success();
}
}

5
app/Models/AgentProduct.php

@ -53,11 +53,6 @@ class AgentProduct extends BaseModel
return $this->belongsTo(self::class, 'agent_cloud_pid', 'id');
}
public function setChannelIdAttribute($value)
{
$this->attributes['channel_id'] = is_array($value) ? join(',', array_filter($value)) : $value;
}
public function setPicturesAttribute($value)
{
$this->attributes['pictures'] = is_array($value) ? (json_encode(array_filter($value)) ?? '[]') : '[]';

34
app/Models/Channel.php

@ -1,34 +0,0 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\ModelTree;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* 频道列表
* Class Channel
* @package App\Models
*/
class Channel extends BaseModel
{
use HasFactory, SoftDeletes;
use ModelTree;
// 模型树需要的三个属性
protected $parentColumn = 'pid';
protected $orderColumn = 'sort';
protected $titleColumn = 'name';
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->timestamps = false;
}
public function parent()
{
return $this->hasOne(self::class, 'id', 'pid');
}
}

13
app/Models/UserCategory.php

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class UserCategory extends Model
{
protected $primaryKey = 'user_id';
public $timestamps = false;
protected $guarded = [];
protected $casts = ['categories' => 'json'];
}

26
app/Models/UserChannel.php

@ -1,26 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
/**
* 我的频道
* Class UserChannel
* @package App\Models
*/
class UserChannel extends BaseModel
{
use HasFactory;
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->timestamps = false;
}
// 获取时需要转换,写入时框架可自动将数组转换后保存
public function getChannelsAttribute($value)
{
return json_decode($value, true);
}
}

16
resources/lang/zh_CN/channel.php

@ -1,16 +0,0 @@
<?php
return [
'labels' => [
'Channel' => '频道',
'channel' => '频道',
],
'fields' => [
'agent_id' => '代理商ID',
'icon' => '频道图标',
'name' => '频道名称',
'pid' => '父级ID',
'sort' => '排序',
],
'options' => [
],
];

7
routes/api.php

@ -51,8 +51,7 @@ Route::namespace('App\Http\Controllers\Api')
# 频道
Route::prefix('channel')->group(function () {
Route::post('list', 'ChannelController@index'); //频道列表
Route::post('product', 'ChannelController@product'); //频道产品列表
Route::post('list', 'CategoryController@index_channel'); //频道列表
});
# 产品
@ -99,8 +98,8 @@ Route::namespace('App\Http\Controllers\Api')
->group(function () {
# 我的频道
Route::prefix('user_channel')->group(function () {
Route::post('list', 'UserChannelController@index'); //我的频道列表
Route::post('update', 'UserChannelController@update'); //编辑我的频道
Route::post('list', 'UserCategoryController@index'); //我的频道列表
Route::post('update', 'UserCategoryController@update'); //编辑我的频道
});
# 订单

Loading…
Cancel
Save