添加文章扩展
parent
183ec96d4f
commit
0970c590b4
|
|
@ -0,0 +1,7 @@
|
|||
.DS_Store
|
||||
phpunit.phar
|
||||
/vendor
|
||||
composer.phar
|
||||
composer.lock
|
||||
*.project
|
||||
.idea/
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Dcat Admin Extension
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"name": "peidikeji/article",
|
||||
"alias": "article",
|
||||
"description": "Description...",
|
||||
"type": "library",
|
||||
"keywords": ["dcat-admin", "extension"],
|
||||
"homepage": "https://github.com/peidikeji/article",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "your name",
|
||||
"email": "your email"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.1.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Peidikeji\\Article\\": "src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"dcat-admin": "Peidikeji\\Article\\ArticleServiceProvider",
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Peidikeji\\Article\\ArticleServiceProvider"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
|
||||
return [];
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<?php
|
||||
|
||||
return [];
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'labels' => [
|
||||
'ArticleCategory' => '文章分类',
|
||||
'article-categories'=> '文章分类',
|
||||
],
|
||||
'fields' => [
|
||||
'parent_id' => '上级',
|
||||
'name' => '名称',
|
||||
'key' => 'KEY',
|
||||
'is_recommend' => '推荐状态',
|
||||
'sort' => '排序',
|
||||
'remarks' => '备注'
|
||||
],
|
||||
'options' => [
|
||||
],
|
||||
];
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'labels' => [
|
||||
'Article' => '文章管理',
|
||||
'articles'=> '文章管理',
|
||||
],
|
||||
'fields' => [
|
||||
'title' => '标题',
|
||||
'sub_title' => '副标题',
|
||||
'author' => '作者',
|
||||
'author_name' => '作者',
|
||||
'category_id' => '分类',
|
||||
'category'=>[
|
||||
'name' => '分类',
|
||||
],
|
||||
'admin_user_id' => '创建人',
|
||||
'cover' => '封面',
|
||||
'is_recommend' => '推荐状态',
|
||||
'content' => '内容',
|
||||
'is_enable' => '可用状态',
|
||||
'sort' => '排序',
|
||||
'published_at' => '发布时间',
|
||||
'remarks' => '备注'
|
||||
],
|
||||
'options' => [
|
||||
],
|
||||
];
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?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);
|
||||
// }
|
||||
}
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
<?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';
|
||||
|
||||
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.articles.enable') || Admin::user()->can('dcat.admin.article_categories.edit'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
<?php
|
||||
|
||||
namespace Peidikeji\Article\Http\Controllers;
|
||||
|
||||
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';
|
||||
|
||||
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('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.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.articles.enable') || Admin::user()->can('dcat.admin.articles.edit'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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('banner')
|
||||
->saveFullUrl()
|
||||
->autoSave(false)
|
||||
->autoUpload()
|
||||
->removable(false)//禁止用户从页面点击删除服务器上的文件,可以实现图片覆盖上传效果
|
||||
->retainable();
|
||||
$form->text('author');
|
||||
$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->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);
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Peidikeji\Article\Http\Controllers;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::resource('article-categories', Controllers\ArticleCategoryController::class)->names('article_categories');
|
||||
Route::resource('articles', Controllers\ArticleController::class);
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?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', 'category_id', 'admin_user_id', 'title', 'sub_title', 'cover', 'is_recommend', 'content', 'is_enable', 'sort', 'published_at', 'remarks', 'category_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());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?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');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?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();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
<?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->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->timestamps();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('articles');
|
||||
Schema::dropIfExists('article_categories');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'1.0.0' => [
|
||||
'初始化文章管理',
|
||||
'CreateArticleTable.php',
|
||||
'ArticlePermissionSeeder.php',
|
||||
],
|
||||
];
|
||||
Loading…
Reference in New Issue