4
0
Fork 0
vine_liutk 2022-09-21 13:33:20 +08:00
commit 6ba5088785
59 changed files with 347 additions and 1254 deletions

View File

@ -4,8 +4,50 @@ Fork From [jqhph/dcat-admin](https://github.com/jqhph/dcat-admin)
## 安装
- `composer` 镜像(可选): `composer config repo.packagist composer https://mirrors.aliyun.com/composer/`
- `composer config repositories.peidikeji/dcat-admin git https://gitea.peidikeji.cn/pdkj/dcat-admin.git`
- `composer require peidikeji/dcat-admin`
- 修改 `config/app.php`
```php
return [
'timezone' => env('TIMEZONE', 'Asia/Chongqing'),
'locale' => 'zh_CN',
'faker_locale' => 'zh_CN',
];
```
- 修改 `app\Providers\AppServiceProvider.php`
```php
use Illuminate\Support\Facades\Schema;
use Illuminate\Http\Resources\Json\JsonResource;
public function boot()
{
Schema::defaultStringLength(191);
JsonResource::withoutWrapping();
}
```
- 修改`.env` 中的数据库配置
```
APP_URL=网站域名(如: https://laravel.com)
LOG_DEPRECATIONS_CHANNEL=null(删除本项)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```
- `php artisan admin:publish`
- `php artisan admin:install`
- 进入管理后台 `{host}/admin`, admin, admin
## 改动

View File

@ -1,7 +0,0 @@
.DS_Store
phpunit.phar
/vendor
composer.phar
composer.lock
*.project
.idea/

View File

@ -1,3 +0,0 @@
# Dcat Admin Extension

View File

@ -1,31 +0,0 @@
{
"name": "peidikeji/article",
"alias": "文章管理",
"description": "文章管理",
"type": "library",
"keywords": ["dcat-admin", "extension"],
"homepage": "https://github.com/peidikeji/article",
"license": "MIT",
"authors": [
{
"name": "liutk",
"email": "961510893@qq.com"
}
],
"require": {
"php": ">=7.1.0"
},
"autoload": {
"psr-4": {
"Peidikeji\\Article\\": "src/"
}
},
"extra": {
"dcat-admin": "Peidikeji\\Article\\ArticleServiceProvider",
"laravel": {
"providers": [
"Peidikeji\\Article\\ArticleServiceProvider"
]
}
}
}

View File

@ -1,3 +0,0 @@
<?php
return [];

View File

@ -1,3 +0,0 @@
<?php
return [];

View File

@ -1,19 +0,0 @@
<?php
return [
'labels' => [
'ArticleCategory' => '文章分类',
'article-categories'=> '文章分类',
],
'fields' => [
'parent_id' => '上级',
'name' => '名称',
'key' => 'KEY',
'is_enable' => '可用状态',
'is_recommend' => '推荐状态',
'sort' => '排序',
'remarks' => '备注'
],
'options' => [
],
];

View File

@ -1,31 +0,0 @@
<?php
return [
'labels' => [
'Article' => '文章管理',
'articles'=> '文章管理',
],
'fields' => [
'title' => '标题',
'sub_title' => '副标题',
'author' => '作者',
'author_name' => '作者',
'category_id' => '分类',
'category'=>[
'name' => '分类',
],
'admin_user_id' => '创建人',
'cover' => '封面',
'media_path' => '媒体资源',
'is_recommend' => '推荐状态',
'content' => '内容',
'is_enable' => '可用状态',
'sort' => '排序',
'published_at' => '发布时间',
'remarks' => '备注',
'like_nums' => '点赞数',
'read_nums' => '浏览数'
],
'options' => [
],
];

View File

@ -1,27 +0,0 @@
<?php
namespace Peidikeji\Article;
use Dcat\Admin\Extend\ServiceProvider;
use Dcat\Admin\Admin;
class ArticleServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function init()
{
parent::init();
//
}
// public function settingForm()
// {
// return new Setting($this);
// }
}

View File

@ -1,142 +0,0 @@
<?php
namespace Peidikeji\Article\Http\Controllers;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use Illuminate\Validation\Rule;
use Peidikeji\Article\Models\Article;
use Dcat\Admin\Grid\Column as GridColumn;
use Peidikeji\Article\Models\ArticleCategory;
use Dcat\Admin\Http\Controllers\AdminController;
class ArticleCategoryController extends AdminController
{
protected $translation = 'peidikeji.article::article-category';
protected $extDefaults = [];//例如:['key1'=>'']
public function grid(){
return Grid::make(new ArticleCategory(), function ($grid) {
$grid->disableRowSelector();
$grid->model()->sort();
$grid->column('name')->tree(true, false);
$grid->column('key');
$grid->column('sort')->editable(['mask' => '{alias:\'numeric\',min:0,max:999}']);
$grid->column('is_enable')->if(function(){
return !config('admin.permission.enable') || Admin::user()->can('dcat.admin.article_categories.edit');
})->then(function (GridColumn $column) {
$column->switch();
})->else(function (GridColumn $column) {
$column->bool();
});
$grid->column('is_recommend')
->if(function(){
return !config('admin.permission.enable') || Admin::user()->can('dcat.admin.article_categories.edit');
})->then(function (GridColumn $column) {
$column->switch();
})->else(function (GridColumn $column) {
$column->bool();
});
$grid->model()->orderBy('sort', 'desc');
$grid->model()->orderBy('created_at', 'desc');
$grid->setDialogFormDimensions('50%', '70%');
$grid->disableCreateButton(!(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.article_categories.create')));
$grid->enableDialogCreate();
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
$actions->disableEdit();
$actions->quickEdit(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.article_categories.edit'));
$actions->delete(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.article_categories.destroy'));
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->expand();
$filter->like('name')->width(3);
$filter->like('key')->width(3);
$filter->equal('parent_id', '上级分类')->select(ArticleCategory::selectOptions())->width(3);
});
});
}
public function form()
{
return Form::make(new ArticleCategory(), function (Form $form) {
$form->select('parent_id')->help('不选默认为顶级')->options(ArticleCategory::selectOptions())->default(0);
$form->text('name')->required();
$unique = Rule::unique((new ArticleCategory())->getTable(), 'key');
if ($form->isCreating()) {
$form->text('key')->help('不填则自动生成, 唯一')->rules([$unique]);
} else {
$form->text('key')->required()->help('唯一')->rules([$unique->ignore($form->getKey())]);
}
$form->number('sort')
->min(0)
->default(0)
->help('数值越大, 越靠前');
$form->switch('is_enable')->default(0);
$form->switch('is_recommend')->default(0);
$form->text('remarks');
$form->hidden('level')->default(1);
$form->keyValue('ext', '扩展字段')->default($this->extDefaults)->setKeyLabel('键名')->setValueLabel('键值')
->saving(function($v){
return json_encode($v ?? []);
});
$controller = $this;
$form->saving(function (Form $form) use ($controller) {
if ($form->isCreating() && !$form->key) {
$form->key = $controller->generateKey();
}
});
$form->saved(function (Form $form) {
if ($form->isEditing() && $form->input('is_enable') !== null && $form->input('is_enable') != $form->model()->is_enable) {
//处理分类子级状态同步(层级)父级
ArticleCategory::where('path', 'like', "%-".$form->model()->id."-%")->update(['is_enable' => $form->is_enable]);
//处理父级状态
if($form->is_enable){
//如果状态是开启,判断(层级)父级是否开启
$exPath = trim('-', $form->model()->path);
$parentIds = $exPath ? explode('-', $exPath) : [];
if($parentIds){
ArticleCategory::whereIn('id', $parentIds)->update(['is_enable' => $form->is_enable]);
}
}
}
});
$form->deleting(function (Form $form) {
$hasArticles = Article::where('category_id', $form->getKey())->exists();
if ($hasArticles) {
return $form->response()->error('需要先删除该分类下的文章');
}
$hasChildren = ArticleCategory::where('parent_id', $form->getKey())->exists();
if ($hasChildren) {
return $form->response()->error('需要先删除该分类下的子级');
}
});
});
}
protected function generateKey()
{
do {
$id = ArticleCategory::max('id') + 1;
$key = 'category-' . $id;
} while (ArticleCategory::where('key', $key)->exists());
return $key;
}
}

View File

@ -1,136 +0,0 @@
<?php
namespace Peidikeji\Article\Http\Controllers;
use Carbon\Carbon;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use Peidikeji\Article\Models\Article;
use Dcat\Admin\Grid\Column as GridColumn;
use Peidikeji\Article\Models\ArticleCategory;
use Dcat\Admin\Http\Controllers\AdminController;
class ArticleController extends AdminController
{
protected $translation = 'peidikeji.article::article';
protected $extDefaults = [];//例如:['key1'=>'']
public function grid(){
return Grid::make(Article::with(['category', 'adminUser']), function ($grid) {
$grid->disableRowSelector();
$grid->column('category.name')->label();
$grid->column('title')->display(function ($v) {
if (mb_strlen($v) > 20) {
return mb_substr($v, 0, 17) . '...';
} else {
return $v;
}
});
$grid->column('cover')->image(100, 100);
$grid->column('author_name')->display(function (){
return $this->author_name;
});
$grid->column('like_nums');
$grid->column('read_nums');
$grid->column('sort')->editable(['mask' => '{alias:\'numeric\',min:0,max:999}']);
$grid->column('published_at');
$grid->column('is_enable')->if(function(){
return !config('admin.permission.enable') || Admin::user()->can('dcat.admin.articles.edit');
})->then(function (GridColumn $column) {
$column->switch();
})->else(function (GridColumn $column) {
$column->bool();
});
$grid->column('is_recommend')->if(function(){
return !config('admin.permission.enable') || Admin::user()->can('dcat.admin.articles.edit');
})->then(function (GridColumn $column) {
$column->switch();
})->else(function (GridColumn $column) {
$column->bool();
});
// $grid->column('remarks');
$grid->model()->orderBy('sort', 'desc');
$grid->model()->orderBy('created_at', 'desc');
$grid->setDialogFormDimensions('50%', '70%');
$grid->disableCreateButton(!(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.articles.create')));
$grid->enableDialogCreate();
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
$actions->disableEdit();
$actions->quickEdit(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.articles.edit'));
$actions->delete(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.articles.destroy'));
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->expand();
$filter->equal('category_id', '分类')->select(ArticleCategory::selectOptions())->width(3);
$filter->like('title')->width(3);
$filter->between('published_at')->datetime()->width(7);
});
});
}
public function form()
{
return Form::make(new Article(), function($form){
$form->select('category_id')->options(ArticleCategory::selectOptions(false));
$form->text('title')->required();
$form->text('sub_title');
$form->image('cover')
->uniqueName()
->move('articles/'.Carbon::now()->toDateString())
->saveFullUrl()
->autoSave(false)
->autoUpload()
->removable(false)//禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果
->retainable();
$form->text('author');
$form->file('media_path')->chunked()
->accept('mp4,mp3', 'mp4/*,mp3/*')
->move('articles-media/'.Carbon::now()->toDateString())
->maxSize(204800)//默认最大200M
->saveFullUrl()
->removable(false)
->autoUpload()->autoSave(false);
$form->datetime('published_at');
$form->switch('is_enable')->default(0);
$form->switch('is_recommend')->default(0);
$form->number('sort')->min(0)->default(0);
$form->text('remarks');
$form->keyValue('ext', '扩展字段')->default($this->extDefaults)->setKeyLabel('键名')->setValueLabel('键值')
->saving(function($v){
return json_encode($v ?? []);
});
$form->editor('content')->options([
'plugins' => [
'image',
'lists',
'preview',
'fullscreen',
'table',
],
'toolbar' => [
'undo redo | preview fullscreen | styleselect | fontsizeselect bold italic underline strikethrough forecolor backcolor | image blockquote removeformat codesample',
'alignleft aligncenter alignright alignjustify| indent outdent bullist numlist table subscript superscript | code',
]
])->height('800');
Admin::style(<<<css
.tox.tox-silver-sink.tox-tinymce-aux{
z-index:99999999;
}
css);
});
}
}

View File

@ -1,12 +0,0 @@
<?php
use Peidikeji\Article\Http\Controllers;
use Illuminate\Support\Facades\Route;
if(! Route::has('dcat.admin.article_categories.index')){
Route::resource('article-categories', Controllers\ArticleCategoryController::class)->names('article_categories');
}
if(! Route::has('dcat.admin.articles.index')){
Route::resource('articles', Controllers\ArticleController::class);
}

View File

@ -1,75 +0,0 @@
<?php
namespace Peidikeji\Article\Models;
use Dcat\Admin\Admin;
use EloquentFilter\Filterable;
use Dcat\Admin\Models\Administrator;
use Illuminate\Database\Eloquent\Model;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory;
/**
* @method static \Illuminate\Database\Eloquent\Builder
*/
class Article extends Model
{
use HasFactory;
use HasDateTimeFormatter;
use Filterable;
protected $fillable = [
'author', 'admin_user_id', 'title', 'sub_title', 'cover', 'content',
'is_recommend', 'is_enable', 'sort', 'published_at',
'remarks', 'category_id', 'category_path',
'like_nums', 'read_nums', 'media_path'
];
protected $dates = ['published_at'];
public static function boot()
{
parent::boot();
static::saving(function ($model) {
$model->admin_user_id = Admin::user()->id;
// 添加/修改分类时, 更新 category_path
if ($model->isDirty('category_id')) {
$model->category_path = ArticleCategory::where('id', $model->category_id)->value('path') . $model->category_id . '-';
}
});
}
public function category()
{
return $this->belongsTo(ArticleCategory::class, 'category_id');
}
public function adminUser()
{
return $this->belongsTo(Administrator::class, 'admin_user_id');
}
public function getAuthorNameAttribute()
{
return $this->attributes['author'] ?? ($this->attributes['admin_user_id'] ? (Administrator::find($this->attributes['admin_user_id'])?->name ?? '未知') : '未知');
}
//public function image(): Attribute
//{
// return Attribute::make(
// get: fn ($v) => $v ?: 'https://via.placeholder.com/640x480.png',
// set: fn ($v) => $v ?: 'https://via.placeholder.com/640x480.png',
// );
//}
public function scopeSort($q)
{
return $q->orderBy('sort', 'desc')->latest('published_at')->latest('id');
}
public function scopePublish($q)
{
return $q->where('published_at', '<=', now());
}
}

View File

@ -1,70 +0,0 @@
<?php
namespace Peidikeji\Article\Models;
use Dcat\Admin\Traits\ModelTree;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ArticleCategory extends Model
{
use HasFactory;
use ModelTree;
use Filterable;
protected $fillable = ['key', 'name', 'is_recommend', 'is_enable', 'sort', 'level', 'path', 'parent_id', 'remarks'];
protected $titleColumn = 'name';
protected $orderColumn = 'sort';
public static function boot()
{
parent::boot();
static::saving(function ($category) {
// 如果创建的是一个根类目
if (!$category->parent_id) {
// 将层级设为 1
$category->level = 1;
// 将 path 设为 -
$category->path = '-';
} else {
// 将层级设为父类目的层级 + 1
$category->level = $category->parent->level + 1;
// 将 path 值设为父类目的 path 追加父类目 ID 以及最后跟上一个 - 分隔符
$category->path = $category->parent->path . $category->parent_id . '-';
}
});
}
public static function selectOptions($root = true)
{
$rootText = '顶级';
$options = (new static())->withQuery(function ($q) {
return $q->sort();
})->buildSelectOptions();
return collect($options)->when($root, fn ($c) => $c->prepend($rootText, 0))->all();
}
public function articles()
{
return $this->hasMany(Article::class, 'category_id');
}
public function parent()
{
return $this->belongsTo(static::class, 'parent_id');
}
public function children()
{
return $this->hasMany(static::class, 'parent_id')->sort();
}
public function scopeSort($q)
{
return $q->orderBy('sort', 'desc')->orderBy('id');
}
}

View File

@ -1,14 +0,0 @@
<?php
namespace Peidikeji\Article;
use Dcat\Admin\Extend\Setting as Form;
class Setting extends Form
{
public function form()
{
$this->text('key1')->required();
$this->text('key2')->required();
}
}

View File

@ -1,35 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddMediaToArticleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (Schema::hasTable('articles')) {
Schema::table('articles', function (Blueprint $table) {
$table->string('media_path')->nullable()->comment('资源地址');
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('articles', function (Blueprint $table) {
//
$table->dropColumn('media_path');
});
}
};

View File

@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddnumToArticleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (Schema::hasTable('articles')) {
Schema::table('articles', function (Blueprint $table) {
$table->unsignedBigInteger('like_nums')->default(0)->comment('点赞数');
$table->unsignedBigInteger('read_nums')->default(0)->comment('阅读数');
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('articles', function (Blueprint $table) {
//
$table->dropColumn(['like_nums', 'read_nums']);
});
}
};

View File

@ -1,70 +0,0 @@
<?php
namespace Database\Seeders;
use Dcat\Admin\Models\Permission;
use Illuminate\Database\Seeder;
class ArticlePermissionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$permissions = [
'article_categories' => ['name' => '文章分类管理', 'curd' => true],
'articles' => ['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);
}
}
}
}
}

View File

@ -1,70 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateArticleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (!Schema::hasTable('article_categories')) {
Schema::create('article_categories', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('名称');
$table->string('key')->unique()->nullable()->comment('key');
$table->unsignedTinyInteger('is_recommend')->default(0)->comment('推荐状态');
$table->unsignedTinyInteger('is_enable')->default(1)->comment('可用状态');
$table->unsignedBigInteger('parent_id')->default(0)->comment('上级ID');
$table->unsignedInteger('level')->default(1)->comment('层级');
$table->string('path')->default('-')->comment('所有的父级ID');
$table->unsignedInteger('sort')->default(0)->comment('排序 desc');
$table->string('remarks')->nullable()->comment('备注');
$table->text('ext')->nullable()->comment('扩展字段可用于SEO配置等');
$table->timestamps();
});
}
if (!Schema::hasTable('articles')) {
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id')->nullable()->comment('分类ID');
$table->string('category_path')->default('-')->comment('分类 path');
$table->unsignedBigInteger('admin_user_id')->comment('创建人');
$table->string('title')->comment('文章标题');
$table->string('sub_title')->nullable()->comment('副标题');
$table->string('author')->nullable()->comment('作者');
$table->string('cover')->nullable()->comment('封面');
$table->longText('content')->nullable()->comment('文章内容');
$table->timestamp('published_at')->nullable()->comment('发布时间');
$table->unsignedInteger('sort')->default(1)->comment('排序 desc');
$table->string('remarks')->nullable()->comment('备注');
$table->unsignedTinyInteger('is_recommend')->default(0)->comment('推荐状态');
$table->unsignedTinyInteger('is_enable')->default(1)->comment('可用状态');
$table->text('ext')->nullable()->comment('扩展字段可用于SEO配置等');
$table->timestamps();
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('articles');
Schema::dropIfExists('article_categories');
}
};

View File

@ -1,16 +0,0 @@
<?php
return [
'1.0.0' => [
'初始化文章管理',
'CreateArticleTable.php',
],
'1.0.1' => [
'文章添加点赞,浏览字段',
'AddnumToArticleTable.php',
],
'1.0.2' => [
'文章添加媒体内容',
'AddMediaToArticleTable.php',
],
];

View File

@ -1,3 +1,60 @@
# 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'],
]]
];
```
## 接口文档
[Apifox](https://www.apifox.cn/apidoc/shared-86eb60cb-ba8f-46c6-b718-f33f99de5e7d/api-39896291)
## 数据表
### 广告位: 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 | - | 更新时间 |

View File

@ -12,7 +12,10 @@ return [
'sort'=>'排序',
'is_enable'=>'启用',
'remarks'=> '备注',
'ext'=>'扩展字段'
'ext'=>'扩展字段',
'ad' => [
'name' => '广告位'
],
],
'options' => [
],

View File

@ -1,28 +0,0 @@
<?php
namespace Peidikeji\Banner;
use EloquentFilter\ModelFilter;
class BannerAdFilter extends ModelFilter
{
/**
* Related Models that have ModelFilters as well as the method on the ModelFilter
* As [relationMethod => [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);
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace Peidikeji\Banner;
use EloquentFilter\ModelFilter;
class BannerFilter extends ModelFilter
{
/**
* Related Models that have ModelFilters as well as the method on the ModelFilter
* As [relationMethod => [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.'%');
});
}
}

View File

@ -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();
//
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace Peidikeji\Banner\Http\Controllers;
namespace Peidikeji\Banner\Http\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
@ -18,7 +18,11 @@ class BannerAdController extends AdminController
public function list(Request $request)
{
$query = BannerAd::filter($request->all());
$query = BannerAd::query();
if ($request->filled('q')) {
$query->where('name', 'like', '%'.$request->input('q').'%');
}
$query->select(['id', 'name as text', 'width', 'height']);
@ -73,16 +77,15 @@ class BannerAdController extends AdminController
$form->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);
}

View File

@ -1,62 +1,33 @@
<?php
namespace Peidikeji\Banner\Http\Controllers;
namespace Peidikeji\Banner\Http\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use Dcat\Admin\Widgets\Card;
use Illuminate\Http\Request;
use Peidikeji\Banner\Models\Banner;
use Peidikeji\Banner\Models\BannerAd;
use Dcat\Admin\Grid\Column as GridColumn;
use Dcat\Admin\Http\Controllers\AdminController;
use Peidikeji\Banner\Http\Resources\BannerResource;
use Peidikeji\Banner\Models\BannerAd;
class BannerController extends AdminController
{
protected $translation = 'peidikeji.banner::banner';
protected $extDefaults = [];//例如:['key1'=>'']
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(Banner::with(['ad']), function (Grid $grid) {
$grid->model()->sort();
$grid->disableRowSelector();
$grid->column('path')->image(100);
$grid->column('ad.name');
$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 +35,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('<pre class="dump">%s</pre>', 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('<pre class="dump">%s</pre>', json_encode($this->ext, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)));
return "<div style='padding:10px 10px 0'>$card</div>";
return "<div style='padding:10px 10px 0'>$card</div>";
});
});
});
$grid->column('remarks');
@ -91,16 +62,18 @@ class BannerController extends AdminController
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->expand();
$filter->equal('ad_id')->select(BannerAd::pluck('name', 'id'))->width(3);
$filter->like('name')->width(3);
});
});
}
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 +81,11 @@ class BannerController extends AdminController
->saveFullUrl()
->autoSave(false)
->autoUpload()
->removable(false)//禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果
->removable(false) //禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果
->retainable()
->required()->help('建议尺寸:');
Admin::script(
<<<JS
Admin::script(
<<<JS
$('body').on('select2:select', 'select.field_ad_id', function(e){
let url_path = '/admin/api/banner-ads?id=' + e.params.data.id
$.ajax({
@ -131,12 +104,13 @@ class BannerController extends AdminController
}
});
});
JS);
JS
);
$form->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');
});
}

View File

@ -0,0 +1,35 @@
<?php
namespace Peidikeji\Banner\Http\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Peidikeji\Banner\Models\BannerAd;
use Peidikeji\Banner\Http\Resources\BannerResource;
class BannerController extends Controller
{
public function index(Request $request)
{
$request->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();
$data = [];
foreach ($keys as $key) {
$ad = $ads->where('key', $key)->first();
$data[$key] = $ad ? BannerResource::collection($ad->banners) : [];
}
return $this->json($data);
}
}

View File

@ -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 [

View File

@ -1,15 +1,16 @@
<?php
use Peidikeji\Banner\Http\Controllers;
namespace Peidikeji\Banner\Http\Admin;
use Illuminate\Support\Facades\Route;
if(! Route::has('dcat.admin.api.banner_ads')){
Route::get('api/banner-ads', [Controllers\BannerAdController::class, 'list'])->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);
}

View File

@ -1,9 +1,9 @@
<?php
namespace Peidikeji\Banner\Http\Controllers;
namespace Peidikeji\Banner\Http\Api;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => 'api', 'prefix' => 'api'], function () {
Route::get('banners', [BannerController::class, 'json']);
Route::get('banner', [BannerController::class, 'index']);
});

View File

@ -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');
}
}

View File

@ -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');

View File

@ -1,14 +0,0 @@
<?php
namespace Peidikeji\Banner;
use Dcat\Admin\Extend\Setting as Form;
class Setting extends Form
{
public function form()
{
$this->text('key1')->required();
$this->text('key2')->required();
}
}

View File

@ -1,71 +0,0 @@
<?php
namespace Database\Seeders;
use Dcat\Admin\Models\Permission;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class BannerPermissionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$permissions = [
'banner_ads' => ['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);
}
}
}
}
}

View File

@ -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('备注');

View File

@ -2,7 +2,6 @@
return [
'1.0.0' => [
'初始化广告管理插件',
'CreateBannerTable.php',
],
];

View File

@ -11,3 +11,19 @@
| parent_id | bigint unsigned | notnull | 0 | - | 上级id |
| type_key | string(191) | nullable | - | - | 上级的key |
| level | int unsigned | - | 1 | - | 所属层级 |
## 权限
```php
$permissions = [
'keywords' => ['name' => '字典管理', 'curd' => true],
];
```
## 菜单
```php
$menus = [
['title' => '字典管理', 'icon' => '', 'uri' => '/keywords', 'permission' => 'keywords'],
];
```

View File

@ -4,7 +4,7 @@
"description": "字典表管理",
"type": "library",
"keywords": ["dcat-admin", "extension"],
"homepage": "https://gitee.com/paddy_technology/dcat-admin-extension-keywords",
"homepage": "https://gitea.peidikeji.cn/pdkj/dcat-admin/src/branch/master/packages/keywords",
"license": "MIT",
"authors": [
{
@ -12,9 +12,6 @@
"email": "1163816051@qq.com"
}
],
"require": {
"php": ">=7.1.0"
},
"autoload": {
"psr-4": {
"Peidikeji\\Keywords\\": "src/"

View File

@ -7,7 +7,7 @@ return [
],
'fields' => [
'name' => '名称',
'key' => '',
'key' => 'Key',
'value' => '值',
'parent_id' => '上级',
],

View File

@ -1,6 +1,6 @@
<?php
namespace Peidikeji\Keywords\Http\Controllers;
namespace Peidikeji\Keywords\Http\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
@ -8,7 +8,6 @@ use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Show;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Peidikeji\Keywords\Http\Resources\KeywordResource;
use Peidikeji\Keywords\Models\Keywords;
class KeywordsController extends AdminController
@ -29,22 +28,6 @@ class KeywordsController extends AdminController
return $list;
}
public function json(Request $request)
{
$query = Keywords::filter($request->all());
$list = $query->get();
return response()->json(['code' => 200, 'data' => KeywordResource::collection($list), 'message' => '']);
}
public function jsonOne($key)
{
$info = Keywords::where('key', $key)->firstOrFail();
return response()->json(['code' => 200, 'data' => KeywordResource::make($info), 'message' => '']);
}
protected function grid()
{
return Grid::make(new Keywords(), function ($grid) {
@ -84,13 +67,13 @@ class KeywordsController extends AdminController
protected function form()
{
return Form::make(new Keywords(), function (Form $form) {
$form->select('parent_id')->ajax(admin_url('api/keywords?'.http_build_query(['_paginate' => 1, 'parent_id' => '0'])));
$form->select('parent_id')->ajax(admin_url('api/keywords?'.http_build_query(['_paginate' => 1, 'parent_id' => '0'])))->model(Keywords::class, 'id', 'name');
$unique = Rule::unique((new Keywords())->getTable());
if ($form->isEditing()) {
$unique->ignore($form->getKey());
}
$form->text('key')->required()->rules([$unique]);
$form->text('key')->required()->rules([$unique])->help('不能重复');
$form->text('name')->required();
$form->text('value');

View File

@ -0,0 +1,27 @@
<?php
namespace Peidikeji\Keywords\Http\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Peidikeji\Keywords\Http\Resources\KeywordResource;
use Peidikeji\Keywords\Models\Keywords;
class KeywordsController extends Controller
{
public function index(Request $request)
{
$query = Keywords::filter($request->all());
$list = $query->get();
return $this->json(KeywordResource::collection($list));
}
public function show($key)
{
$info = Keywords::where(fn($q) => $q->where('key', $key)->orWhere('id', $key))->firstOrFail();
return $this->json(KeywordResource::make($info));
}
}

View File

@ -20,6 +20,8 @@ class KeywordResource extends JsonResource
'key' => $this->key,
'type_key' => $this->type_key,
'value' => $this->value,
'parent_id' => $this->parent_id,
'level' => $this->level,
];
}
}

View File

@ -1,6 +1,6 @@
<?php
namespace Peidikeji\Keywords\Http\Controllers;
namespace Peidikeji\Keywords\Http\Admin;
use Illuminate\Support\Facades\Route;

View File

@ -1,10 +1,10 @@
<?php
namespace Peidikeji\Keywords\Http\Controllers;
namespace Peidikeji\Keywords\Http\Api;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => 'api', 'prefix' => 'api'], function () {
Route::get('keywords', [KeywordsController::class, 'json']);
Route::get('keywords/{key}', [KeywordsController::class, 'jsonOne']);
Route::get('keywords', [KeywordsController::class, 'index']);
Route::get('keywords/{key}', [KeywordsController::class, 'show']);
});

View File

@ -6,17 +6,12 @@ use Dcat\Admin\Extend\ServiceProvider;
class KeywordsServiceProvider extends ServiceProvider
{
protected $menu = [
// ['title' => 'Keywords', 'uri' => 'keywords', 'icon' => ''],
];
// protected $menu = [
// ['title' => 'Keywords', 'uri' => 'keywords', 'icon' => 'feather icon-list'],
// ];
public function init()
{
parent::init();
}
// public function settingForm()
// {
// return new Setting($this);
// }
}

View File

@ -1,14 +0,0 @@
<?php
namespace Peidikeji\Keywords;
use Dcat\Admin\Extend\Setting as Form;
class Setting extends Form
{
public function form()
{
$this->text('key1')->required();
$this->text('key2')->required();
}
}

View File

@ -1,56 +0,0 @@
<?php
use Dcat\Admin\Models\Permission;
use Illuminate\Database\Seeder;
class KeywordsTableSeeder extends Seeder
{
public function run()
{
// 添加权限
$permissions = [
'keywords' => ['name' => '字典管理', 'curd' => true]
];
// Permission::where('slug', 'like', 'dcat.admin.keywords%')->delete();
$this->createPermissionData($permissions);
}
protected 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);
}
}
}
}
}

View File

@ -3,6 +3,5 @@
return [
'1.0.0' => [
'CreateKeywordsTable.php',
'KeywordsTableSeeder.php'
],
];

View File

@ -1,3 +1,29 @@
# Dcat Admin Extension
# Dcat Admin Extension Setting
配置管理, 使用 `dcat-admin` 原有的数据表 `admin_settings`
## 数据表
| column | type | nullable | default | comment |
| - | - | - | - | - |
| slug | varchar(100) | not null | - | 主键 |
| name | varchart(100) | null | - | 名称 |
| value | longtext | null | - | 内容 |
| created_at | timestamp | null | - | 创建时间 |
| updated_at | timestamp | null | - | 更新时间 |
## 权限
```php
$permissions = [
'settings' => ['name' => '配置管理', 'curd' => true],
];
```
## 菜单
```php
$menus = [
['title' => '配置管理', 'icon' => '', 'uri' => '/settings', 'permission' => 'settings'],
];
```

View File

@ -3,8 +3,8 @@
"alias": "setting",
"description": "Setting",
"type": "library",
"keywords": ["dcat-admin", "extension"],
"homepage": "https://github.com/peidikeji/setting",
"keywords": ["dcat-admin", "extension", "setting"],
"homepage": "https://gitea.peidikeji.cn/pdkj/dcat-admin/src/branch/master/packages/setting",
"license": "MIT",
"authors": [
{
@ -12,9 +12,6 @@
"email": "1163816051@qq.com"
}
],
"require": {
"php": ">=7.1.0"
},
"autoload": {
"psr-4": {
"Peidikeji\\Setting\\": "src/"

View File

@ -12,7 +12,7 @@ use Dcat\Admin\Http\Controllers\AdminController;
class SettingController extends AdminController
{
protected $translation = 'peidikeji.setting::setting';
protected $translation = 'peidikeji.dcat-admin-extension-setting::setting';
protected function grid()
{
@ -23,13 +23,13 @@ class SettingController extends AdminController
$grid->column('name');
$grid->column('value');
$grid->disableCreateButton(!(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.settings.create')));
$grid->showCreateButton(Admin::user()->can('dcat.admin.settings.create'));
$grid->enableDialogCreate();
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
$actions->disableEdit();
$actions->quickEdit(!config('admin.permission.enable') || Admin::user()->can('dcat.admin.settings.edit'));
$actions->quickEdit(Admin::user()->can('dcat.admin.settings.edit'));
});
$grid->quickSearch(['slug', 'name', 'value'])->placeholder('输入 key/名称/value 搜索');

View File

@ -1,14 +0,0 @@
<?php
namespace Peidikeji\Setting;
use Dcat\Admin\Extend\Setting as Form;
class Setting extends Form
{
public function form()
{
$this->text('key1')->required();
$this->text('key2')->required();
}
}

View File

@ -3,29 +3,19 @@
namespace Peidikeji\Setting;
use Dcat\Admin\Extend\ServiceProvider;
use Dcat\Admin\Admin;
class SettingServiceProvider extends ServiceProvider
{
protected $menu = [
// ['title' => 'Setting', 'uri' => 'keywords', 'icon' => ''],
];
// protected $menu = [
// ['title' => '配置管理', 'uri' => 'settings', 'icon' => 'fa fa-gear'],
// ];
public function register()
{
//
}
public function init()
{
parent::init();
//
}
// public function settingForm()
// {
// return new Setting($this);
// }
}

View File

@ -1,69 +0,0 @@
<?php
namespace Database\Seeders;
use Dcat\Admin\Models\Permission;
use Illuminate\Database\Seeder;
class SettingPermissionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$permissions = [
'settings' => ['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);
}
}
}
}
}

View File

@ -4,9 +4,5 @@ return [
'1.0.0' => [
'初始化配置管理',
'CreateAdminSettingsTable.php',
],
'1.0.1' => [
'添加配置管理权限迁移文件',
'SettingPermissionSeeder.php'
]
];

View File

@ -0,0 +1,31 @@
<?php
namespace Dcat\Admin\Models;
use Illuminate\Database\Eloquent\Model;
class Setting extends Model
{
protected $primaryKey = 'slug';
public $incrementing = false;
protected $fillable = ['slug', 'value'];
/**
* {@inheritDoc}
*/
public function __construct(array $attributes = [])
{
$this->init();
parent::__construct($attributes);
}
protected function init()
{
$connection = config('admin.database.connection') ?: config('database.default');
$this->setConnection($connection);
$this->setTable(config('admin.database.settings_table') ?: 'admin_settings');
}
}

View File

@ -140,7 +140,7 @@ class Form implements Renderable
*
* @var array
*/
protected $buttons = ['reset' => true, 'submit' => true];
protected $buttons = ['reset' => true, 'submit' => true, 'back' => false];
/**
* @var bool
@ -489,6 +489,13 @@ class Form implements Renderable
return $this;
}
public function backButton(bool $value = true)
{
$this->buttons['back'] = $value;
return $this;
}
/**
* Disable reset button.
*
@ -500,6 +507,11 @@ class Form implements Renderable
return $this->resetButton(! $value);
}
public function disableBackButton(bool $value = true)
{
return $this->backButton(! $value);
}
/**
* Disable submit button.
*
@ -623,7 +635,7 @@ class Form implements Renderable
return <<<HTML
<div class="box-footer row d-flex">
<div class="col-md-2"> &nbsp;</div>
<div class="col-md-8">{$this->renderResetButton()}{$this->renderSubmitButton()}</div>
<div class="col-md-8">{$this->renderBackButton()}{$this->renderResetButton()}{$this->renderSubmitButton()}</div>
</div>
HTML;
}
@ -644,6 +656,15 @@ HTML;
}
}
protected function renderBackButton()
{
if (! empty($this->buttons['back'])) {
$back = trans('admin.back');
return "<a href=\"javascript: window.history.back()\" class=\"btn btn-white pull-left\"><i class=\"feather icon-arrow-left\"></i> {$back}</a>";
}
}
/**
* 提交按钮文本.
*