4
0
Fork 0

remove extension article

master
panliang 2022-09-16 15:40:09 +08:00
parent fdeb57ec7e
commit b3418d033c
20 changed files with 0 additions and 800 deletions

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',
],
];