diff --git a/packages/banner/README.md b/packages/banner/README.md index 838df4c..f3f32c2 100644 --- a/packages/banner/README.md +++ b/packages/banner/README.md @@ -1,3 +1,56 @@ -# Dcat Admin Extension +# Dact-Admin Extension Banner +广告管理 +## 权限 + +```php +$permissions = [ + 'image' => ['name' => '广告管理', 'curd' => false, 'children' => [ + 'banner_ads' => ['name' => '广告位置', 'curd' => true], + 'banners' => ['name' => '广告内容', 'curd' => true], + ]], +]; +``` + +## 菜单 + +```php +$menus = [ + ['title' => '广告管理', 'icon' => 'feather icon-image', 'uri' => '', 'permission' => ['banner_ads', 'banners'], 'children' => [ + ['title' => '广告位置', 'icon' => '', 'uri' => '/banner-ads', 'permission' => 'banner_ads'], + ['title' => '广告内容', 'icon' => '', 'uri' => '/banners', 'permission' => 'banners'], + ]] +]; +``` + +## 数据表 + +### 广告位: banner_ads + +| column | type | nullable | default | comment | +| - | - | - | - | - | +| id | bigint | not null | - | 主键 | +| name | varchar(100) | not null | - | 名称 | +| key | varchar(100) | not null | - | 关键字(unique) | +| width | integer | null | - | 建议尺寸 | +| height | integer | null | - | 建议尺寸 | +| is_enable | integer | not null | 1 | 是否可用 | +| remarks | varchar(100) | null | - | 备注 | +| created_at | timestamp | null | - | 创建时间 | +| updated_at | timestamp | null | - | 更新时间 | + +### 广告图: banner + +| column | type | nullable | default | comment | +| - | - | - | - | - | +| id | bigint | not null | - | 主键 | +| ad_id | bigint | not null | - | 位置 id | +| path | varchar(191) | not null | - | 图片地址 | +| name | varchar(191) | null | - | 名称 | +| sort | integer | not null | 1 | 排序(asc) | +| is_enable | integer | not null | 1 | 是否可用 | +| ext | json | null | - | 其他配置 | +| remarks | varchar(191) | null | - | 备注 | +| created_at | timestamp | null | - | 创建时间 | +| updated_at | timestamp | null | - | 更新时间 | diff --git a/packages/banner/src/BannerAdFilter.php b/packages/banner/src/BannerAdFilter.php deleted file mode 100644 index 9a504ab..0000000 --- a/packages/banner/src/BannerAdFilter.php +++ /dev/null @@ -1,28 +0,0 @@ - [input_key1, input_key2]]. - * - * @var array - */ - public $relations = []; - - public function q($v) - { - $this->where(function ($q) use ($v) { - $q->where('key', 'like', '%'.$v.'%')->orWhere('name', 'like', '%'.$v.'%'); - }); - } - - public function key($v) - { - $this->where('key', $v); - } -} diff --git a/packages/banner/src/BannerFilter.php b/packages/banner/src/BannerFilter.php deleted file mode 100644 index 3f0cbbd..0000000 --- a/packages/banner/src/BannerFilter.php +++ /dev/null @@ -1,23 +0,0 @@ - [input_key1, input_key2]]. - * - * @var array - */ - public $relations = []; - - public function q($v) - { - $this->where(function ($q) use ($v) { - $q->where('key', 'like', '%'.$v.'%')->orWhere('name', 'like', '%'.$v.'%'); - }); - } -} diff --git a/packages/banner/src/BannerServiceProvider.php b/packages/banner/src/BannerServiceProvider.php index 56a874b..35df930 100644 --- a/packages/banner/src/BannerServiceProvider.php +++ b/packages/banner/src/BannerServiceProvider.php @@ -3,21 +3,17 @@ namespace Peidikeji\Banner; use Dcat\Admin\Extend\ServiceProvider; -use Dcat\Admin\Admin; class BannerServiceProvider extends ServiceProvider { - - public function register() - { - // - } + protected $menu = [ + ['parent' => '', 'title' => '广告管理', 'icon' => 'feather icon-image', 'uri' => ''], + ['parent' => '广告管理', 'title' => '广告位置', 'icon' => '', 'uri' => 'banner-ads'], + ['parent' => '广告管理', 'title' => '广告内容', 'icon' => '', 'uri' => 'banners'], + ]; public function init() { parent::init(); - - // - } } diff --git a/packages/banner/src/Http/Controllers/BannerAdController.php b/packages/banner/src/Http/Admin/BannerAdController.php similarity index 93% rename from packages/banner/src/Http/Controllers/BannerAdController.php rename to packages/banner/src/Http/Admin/BannerAdController.php index 38c5b64..50993cd 100644 --- a/packages/banner/src/Http/Controllers/BannerAdController.php +++ b/packages/banner/src/Http/Admin/BannerAdController.php @@ -1,6 +1,6 @@ text('key')->required()->rules([Rule::unique((new BannerAd())->getTable())]); $form->number('width')->min(0); $form->number('height')->min(0); - $form->switch('is_enable'); + $form->switch('is_enable')->default(1); $form->text('remarks'); }); } - public function destroy($id){ + public function destroy($id) + { //如果该广告位下还有内容,则一起删除 - Banner::where([ - 'ad_id' => $id - ])->delete(); + Banner::where(['ad_id' => $id])->delete(); return parent::destroy($id); } diff --git a/packages/banner/src/Http/Controllers/BannerController.php b/packages/banner/src/Http/Admin/BannerController.php similarity index 62% rename from packages/banner/src/Http/Controllers/BannerController.php rename to packages/banner/src/Http/Admin/BannerController.php index e236cfe..770992a 100644 --- a/packages/banner/src/Http/Controllers/BannerController.php +++ b/packages/banner/src/Http/Admin/BannerController.php @@ -1,62 +1,31 @@ ''] - - public function json(Request $request) - { - $keys = (array) $request->input('keys'); - - if (empty($keys)) { - return response()->json([]); - } - - - $ads = BannerAd::with([ - 'banners' => function ($query) { - $query->enable()->latest('sort'); - }, - ])->enable()->whereIn('key', $keys)->get(); - - $mapAds = $ads->mapWithKeys(function ($item) use ($request) { - return [ - $item->key => BannerResource::collection($item->banners)->resolve($request), - ]; - }); - - foreach ($keys as $key) { - if (! $mapAds->has($key)) { - $mapAds->put($key, []); - } - } - - return response()->json($mapAds); - } + protected $extDefaults = []; protected function grid() { - return Grid::make(new Banner(), function ($grid) { + return Grid::make(new Banner(), function (Grid $grid) { + $grid->model()->sort(); + $grid->disableRowSelector(); - $grid->column('path')->image(100); + $grid->column('path')->image('', 50); $grid->column('name'); $grid->column('sort'); - $grid->column('is_enable')->if(function(){ + $grid->column('is_enable')->if(function () { return !config('admin.permission.enable') || Admin::user()->can('dcat.admin.banners.edit'); })->then(function (GridColumn $column) { $column->switch(); @@ -64,16 +33,16 @@ class BannerController extends AdminController $column->bool(); }); $grid->column('ext') - ->if(function(){ - return $this->ext; - })->then(function (GridColumn $column) { - $column->display('展开')->expand(function () { - // 返回显示的详情 - $card = new Card(null, sprintf('
%s
', json_encode($this->ext, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE))); + ->if(function () { + return $this->ext; + })->then(function (GridColumn $column) { + $column->display('展开')->expand(function () { + // 返回显示的详情 + $card = new Card(null, sprintf('
%s
', json_encode($this->ext, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE))); - return "
$card
"; + return "
$card
"; + }); }); - }); $grid->column('remarks'); @@ -96,11 +65,12 @@ class BannerController extends AdminController }); } - protected function form(){ + protected function form() + { return Form::make(new Banner(), function (Form $form) { $form->select('ad_id') - ->options('api/banner-ads') - ->required(); + ->options('api/banner-ads') + ->required(); $form->text('name'); $form->image('path') ->uniqueName() @@ -108,11 +78,11 @@ class BannerController extends AdminController ->saveFullUrl() ->autoSave(false) ->autoUpload() - ->removable(false)//禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果 + ->removable(false) //禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果 ->retainable() ->required()->help('建议尺寸:'); - Admin::script( - <<number('sort') - ->min(0) - ->help('数值越大, 越靠前'); + ->min(0) + ->help('数值越小, 越靠前'); $form->keyValue('ext')->default($this->extDefaults)->setKeyLabel('键名')->setValueLabel('键值'); - $form->switch('is_enable'); + $form->switch('is_enable')->default(1); $form->text('remarks'); }); } diff --git a/packages/banner/src/Http/Api/BannerController.php b/packages/banner/src/Http/Api/BannerController.php new file mode 100644 index 0000000..5c35b59 --- /dev/null +++ b/packages/banner/src/Http/Api/BannerController.php @@ -0,0 +1,41 @@ +validate([ + 'key' => 'required' + ]); + $keys = $request->input('key'); + $keys = is_array($keys) ? $keys : explode(',', $keys); + + $ads = BannerAd::with([ + 'banners' => function ($query) { + $query->enable()->sort(); + }, + ])->enable()->whereIn('key', $keys)->get(); + + $mapAds = $ads->mapWithKeys(function ($item) use ($request) { + return [ + $item->key => BannerResource::collection($item->banners)->resolve($request), + ]; + }); + + foreach ($keys as $key) { + if (! $mapAds->has($key)) { + $mapAds->put($key, []); + } + } + + return $this->json($mapAds); + } + +} diff --git a/packages/banner/src/Http/Resources/BannerResource.php b/packages/banner/src/Http/Resources/BannerResource.php index 4adb6d7..cfbb007 100644 --- a/packages/banner/src/Http/Resources/BannerResource.php +++ b/packages/banner/src/Http/Resources/BannerResource.php @@ -6,12 +6,6 @@ use Illuminate\Http\Resources\Json\JsonResource; class BannerResource extends JsonResource { - /** - * Transform the resource into an array. - * - * @param \Illuminate\Http\Request $request - * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable - */ public function toArray($request) { return [ diff --git a/packages/banner/src/Http/routes.php b/packages/banner/src/Http/routes.php index ab3ef77..6ec9e7a 100644 --- a/packages/banner/src/Http/routes.php +++ b/packages/banner/src/Http/routes.php @@ -1,15 +1,16 @@ name('api.banner_ads'); + Route::get('api/banner-ads', [BannerAdController::class, 'list'])->name('api.banner_ads'); } if(! Route::has('dcat.admin.banner_ads.index')){ - Route::resource('banner-ads', Controllers\BannerAdController::class)->names('banner_ads'); + Route::resource('banner-ads', BannerAdController::class)->names('banner_ads'); } if(! Route::has('dcat.admin.banners.index')){ - Route::resource('banners', Controllers\BannerController::class); + Route::resource('banners', BannerController::class); } diff --git a/packages/banner/src/Http/web.php b/packages/banner/src/Http/web.php index a7e14ea..baec154 100644 --- a/packages/banner/src/Http/web.php +++ b/packages/banner/src/Http/web.php @@ -1,9 +1,9 @@ 'api', 'prefix' => 'api'], function () { - Route::get('banners', [BannerController::class, 'json']); + Route::get('banner', [BannerController::class, 'index']); }); diff --git a/packages/banner/src/Models/Banner.php b/packages/banner/src/Models/Banner.php index 752bd7f..78befcf 100644 --- a/packages/banner/src/Models/Banner.php +++ b/packages/banner/src/Models/Banner.php @@ -2,14 +2,13 @@ namespace Peidikeji\Banner\Models; -use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Model; use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Factories\HasFactory; class Banner extends Model { - use HasFactory, HasDateTimeFormatter, Filterable; + use HasFactory, HasDateTimeFormatter; protected $fillable = ['ad_id', 'path', 'name', 'sort', 'is_enable', 'ext', 'remarks']; @@ -22,7 +21,13 @@ class Banner extends Model return $this->belongsTo(BannerAd::class, 'ad_id'); } - public function scopeEnable($query){ + public function scopeEnable($query) + { return $query->where('is_enable', 1); } + + public function scopeSort($q) + { + return $q->orderBy('sort'); + } } diff --git a/packages/banner/src/Models/BannerAd.php b/packages/banner/src/Models/BannerAd.php index e2a1e48..0f43c17 100644 --- a/packages/banner/src/Models/BannerAd.php +++ b/packages/banner/src/Models/BannerAd.php @@ -2,23 +2,16 @@ namespace Peidikeji\Banner\Models; -use EloquentFilter\Filterable; -use Peidikeji\Banner\BannerAdFilter; use Illuminate\Database\Eloquent\Model; use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Factories\HasFactory; class BannerAd extends Model { - use HasFactory, HasDateTimeFormatter, Filterable; + use HasFactory, HasDateTimeFormatter; protected $fillable = ['name', 'key', 'width', 'height', 'is_enable', 'remarks']; - public function modelFilter() - { - return BannerAdFilter::class; - } - public function banners() { return $this->hasMany(Banner::class, 'ad_id'); diff --git a/packages/banner/src/Setting.php b/packages/banner/src/Setting.php deleted file mode 100644 index 88820ad..0000000 --- a/packages/banner/src/Setting.php +++ /dev/null @@ -1,14 +0,0 @@ -text('key1')->required(); - $this->text('key2')->required(); - } -} diff --git a/packages/banner/updates/BannerPermissionSeeder.php b/packages/banner/updates/BannerPermissionSeeder.php deleted file mode 100644 index 785bd62..0000000 --- a/packages/banner/updates/BannerPermissionSeeder.php +++ /dev/null @@ -1,71 +0,0 @@ - ['name' => '广告位管理', 'curd' => true], - 'banners' => ['name' => '广告图管理', 'curd' => true], - ]; - $this->createPermissionData($permissions); - } - - /** - * 插入权限 - * - * @param array $permissions - * @param string $key - * @param integer $pId - */ - public function createPermissionData(array $permissions, string $key = '', int $pId = 0) - { - $curdArr = [ - 'index' => '列表', - 'create' => '新增', - 'edit' => '修改', - 'destroy' => '删除', - 'show' => '详情', - ]; - foreach ($permissions as $slug => $permission) { - //是否已存在该权限 - $slugKey = 'dcat.admin.' . ($key ? $key . '.' . $slug : $slug); - - - $pper = Permission::updateOrCreate(['slug' => $slugKey], ['name' => is_string($permission) ? $permission : $permission['name'], 'parent_id' => $pId]); - - if (!is_string($permission)) { - if (!isset($permission['children'])) { - $permission['children'] = []; - } - //判断是否默认插入curd权限 - if (isset($permission['curd']) && $permission['curd']) { - if (is_array($permission['curd'])) { - $permission['curd'] = array_reverse($permission['curd']); - foreach ($permission['curd'] as $value) { - $permission['children'] = array_merge([$value => $curdArr[$value]], $permission['children']); - } - } else { - $permission['children'] = array_merge($curdArr, $permission['children']); - } - } - - if (count($permission['children']) > 0) { - $_key = $permission['curd'] !== false ? ($key ? $key . '.' . $slug : $slug) : $key; - $this->createPermissionData($permission['children'], $_key ?? $slug, $pper->id); - } - } - } - } -} diff --git a/packages/banner/updates/CreateBannerTable.php b/packages/banner/updates/CreateBannerTable.php index 48f7342..33adb9a 100644 --- a/packages/banner/updates/CreateBannerTable.php +++ b/packages/banner/updates/CreateBannerTable.php @@ -33,7 +33,7 @@ class CreateBannerTable extends Migration $table->unsignedBigInteger('ad_id')->comment('位置ID'); $table->string('path')->comment('地址'); $table->string('name')->nullable()->comment('名称'); - $table->unsignedInteger('sort')->comment('排序'); + $table->unsignedInteger('sort')->default(1)->comment('排序(asc)'); $table->unsignedTinyInteger('is_enable')->default(1)->comment('可用状态'); $table->text('ext')->nullable()->comment('扩展字段,可用于跳转配置等'); $table->string('remarks')->nullable()->comment('备注'); diff --git a/packages/banner/version.php b/packages/banner/version.php index 92bf9e9..6c09ca3 100644 --- a/packages/banner/version.php +++ b/packages/banner/version.php @@ -2,7 +2,6 @@ return [ '1.0.0' => [ - '初始化广告管理插件', 'CreateBannerTable.php', ], ];