处理冲突
commit
aea7d202e6
|
|
@ -4,7 +4,7 @@ APP_KEY=
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
|
|
||||||
LOG_CHANNEL=stack
|
LOG_CHANNEL=daily
|
||||||
LOG_DEPRECATIONS_CHANNEL=null
|
LOG_DEPRECATIONS_CHANNEL=null
|
||||||
LOG_LEVEL=debug
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ DB_PASSWORD=
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
BROADCAST_DRIVER=log
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
FILESYSTEM_DISK=local
|
FILESYSTEM_DISK=public
|
||||||
QUEUE_CONNECTION=sync
|
QUEUE_CONNECTION=sync
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
SESSION_LIFETIME=120
|
SESSION_LIFETIME=120
|
||||||
|
|
|
||||||
|
|
@ -9,26 +9,36 @@ use Slowlyo\OwlAdmin\Renderers\TextControl;
|
||||||
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
||||||
use App\Services\Admin\ArticleCategoryService;
|
use App\Services\Admin\ArticleCategoryService;
|
||||||
use App\Admin\Components;
|
use App\Admin\Components;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class ArticleCategoryController extends AdminController
|
class ArticleCategoryController extends AdminController
|
||||||
{
|
{
|
||||||
protected string $serviceName = ArticleCategoryService::class;
|
protected string $serviceName = ArticleCategoryService::class;
|
||||||
|
|
||||||
protected string $pageTitle = '文章分类';//待完善-todo
|
|
||||||
|
|
||||||
public function list(): Page
|
public function list(): Page
|
||||||
{
|
{
|
||||||
$crud = $this->baseCRUD()
|
$crud = $this->baseCRUD()
|
||||||
->filterTogglable(false)
|
->filterTogglable(false)
|
||||||
|
->loadDataOnce(true)
|
||||||
|
->footerToolbar([])
|
||||||
->headerToolbar([
|
->headerToolbar([
|
||||||
$this->createButton(true),
|
$this->createButton(true),
|
||||||
...$this->baseHeaderToolBar(),
|
amis('reload')->align('right'),
|
||||||
|
amis('filter-toggler')->align('right'),
|
||||||
])
|
])
|
||||||
|
->quickSaveItemApi(admin_url('quick-edit/article-categories/$id'))
|
||||||
->columns([
|
->columns([
|
||||||
TableColumn::make()->name('id')->label('ID')->sortable(true),
|
['name' => 'id', 'label' => __('article-category.id')],
|
||||||
TableColumn::make()->name('name')->label('名称'),
|
['name' => 'name', 'label' => __('article-category.name')],
|
||||||
TableColumn::make()->name('created_at')->label('创建时间')->type('datetime')->sortable(true),
|
['name' => 'icon', 'label' => __('article-category.icon'), 'type' => 'image', 'width' => 60],
|
||||||
TableColumn::make()->name('updated_at')->label('更新时间')->type('datetime')->sortable(true),
|
['name' => 'sort', 'label' => __('article-category.sort')],
|
||||||
|
['name' => 'is_enable', 'label' => __('article-category.is_enable'), 'type' => 'switch', 'quickEdit' => [
|
||||||
|
'type' => 'switch',
|
||||||
|
'mode' => 'inline',
|
||||||
|
'onText' => __('admin.switch.on'),
|
||||||
|
'offText' => __('admin.switch.off'),
|
||||||
|
'saveImmediately' => true,
|
||||||
|
]],
|
||||||
$this->rowActions(true),
|
$this->rowActions(true),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
@ -40,23 +50,30 @@ class ArticleCategoryController extends AdminController
|
||||||
return $this->baseForm()->body([
|
return $this->baseForm()->body([
|
||||||
TextControl::make()->name('name')->label('名称')->required(true),
|
TextControl::make()->name('name')->label('名称')->required(true),
|
||||||
amisMake()->ImageControl()->name('icon')->label('icon')->autoUpload(true),
|
amisMake()->ImageControl()->name('icon')->label('icon')->autoUpload(true),
|
||||||
Components::make()->parentControl(),
|
Components::make()->parentControl(admin_url('api/article-categories/tree-list')),
|
||||||
Components::make()->sortControl(),
|
Components::make()->sortControl(),
|
||||||
amisMake()->SwitchControl()->name('is_enable')->label('显示'),
|
amisMake()->SwitchControl()->name('is_enable')->value(true)->label('显示'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function detail(): Form
|
public function detail(): Form
|
||||||
{
|
{
|
||||||
return $this->baseDetail()->body([
|
return $this->baseDetail()->body([
|
||||||
TextControl::make()->static(true)->name('id')->label('ID'),
|
['name' => 'id', 'type' => 'static', 'label' => __('article-category.id')],
|
||||||
TextControl::make()->static(true)->name('name')->label('名称'),
|
['name' => 'name', 'type' => 'static', 'label' => __('article-category.name')],
|
||||||
TextControl::make()->static(true)->name('created_at')->label('创建时间'),
|
['name' => 'created_at', 'type' => 'static', 'label' => __('article-category.created_at')],
|
||||||
TextControl::make()->static(true)->name('updated_at')->label('更新时间')
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTreeList(Request $request){
|
public function getTreeList(Request $request)
|
||||||
|
{
|
||||||
return $this->service->getTree();
|
return $this->service->getTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function quickSave(Request $request)
|
||||||
|
{
|
||||||
|
logger('1', $request->all());
|
||||||
|
|
||||||
|
return $this->response()->success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ Route::group([
|
||||||
'prefix' => 'api',
|
'prefix' => 'api',
|
||||||
], function (Router $router) {
|
], function (Router $router) {
|
||||||
$router->get('keywords/tree-list', '\App\Admin\Controllers\KeywordController@getTreeList')->name('api.keywords.tree-list');
|
$router->get('keywords/tree-list', '\App\Admin\Controllers\KeywordController@getTreeList')->name('api.keywords.tree-list');
|
||||||
|
$router->get('article-categories/tree-list', [\App\Admin\Controllers\ArticleCategoryController::class, 'getTreeList'])->name('api.article-categories.tree-list');
|
||||||
$router->get('region-categories/tree-list', '\App\Admin\Controllers\RegionCategoryController@getTreeList')->name('api.region-categories.tree-list');
|
$router->get('region-categories/tree-list', '\App\Admin\Controllers\RegionCategoryController@getTreeList')->name('api.region-categories.tree-list');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -20,8 +21,9 @@ Route::group([
|
||||||
|
|
||||||
//公告管理
|
//公告管理
|
||||||
$router->resource('admin-notices', \App\Admin\Controllers\AdminNoticeController::class);
|
$router->resource('admin-notices', \App\Admin\Controllers\AdminNoticeController::class);
|
||||||
//文章分类
|
// 文章分类
|
||||||
$router->resource('article-categories', \App\Admin\Controllers\ArticleCategoryController::class);
|
$router->resource('article-categories', \App\Admin\Controllers\ArticleCategoryController::class);
|
||||||
|
$router->post('quick-edit/article-categories/{article_category}', [\App\Admin\Controllers\ArticleCategoryController::class, 'update']);
|
||||||
//文章管理
|
//文章管理
|
||||||
$router->resource('articles', \App\Admin\Controllers\ArticleController::class);
|
$router->resource('articles', \App\Admin\Controllers\ArticleController::class);
|
||||||
//图片位置
|
//图片位置
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class ModelFillable extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'model:fillable {table} {--connection}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'get model fillable ';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$table = $this->argument('table');
|
||||||
|
$ignore = ['id', 'created_at', 'updated_at', 'deleted_at'];
|
||||||
|
$connection = $this->option('connection');
|
||||||
|
if (!$connection) {
|
||||||
|
$connection = config('database.default');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::connection($connection)->hasTable($table)) {
|
||||||
|
$list = Schema::connection($connection)->getColumnListing($table);
|
||||||
|
$list = array_filter($list, function ($value) use ($ignore) {
|
||||||
|
return !in_array($value, $ignore);
|
||||||
|
});
|
||||||
|
$this->info("protected \$fillable = ['".implode('\', \'', $list)."'];");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,18 +2,38 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use EloquentFilter\Filterable;
|
use EloquentFilter\Filterable;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
class ArticleCategory extends Model
|
class ArticleCategory extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
|
||||||
use Filterable;
|
use Filterable;
|
||||||
|
|
||||||
protected $fillable = [];
|
protected $casts = [
|
||||||
|
'created_at' => 'datetime:Y-m-d H:i:s',
|
||||||
|
'updated_at' => 'datetime:Y-m-d H:i:s',
|
||||||
|
'is_enable' => 'boolean',
|
||||||
|
];
|
||||||
|
|
||||||
protected function serializeDate(\DateTimeInterface $date){
|
protected $fillable = ['icon', 'is_enable', 'level', 'name', 'parent_id', 'path', 'sort'];
|
||||||
return $date->format('Y-m-d H:i:s');
|
|
||||||
|
protected function icon(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::make(
|
||||||
|
get: fn($value) => $value ? (Str::startsWith($value, ['http://', 'https://']) ? $value : Storage::url($value)) : '',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parent()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(static::class, 'parent_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function children()
|
||||||
|
{
|
||||||
|
return $this->hasMany(static::class, 'parent_id');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ namespace App\Services\Admin;
|
||||||
|
|
||||||
use App\Models\ArticleCategory;
|
use App\Models\ArticleCategory;
|
||||||
use Slowlyo\OwlAdmin\Services\AdminService;
|
use Slowlyo\OwlAdmin\Services\AdminService;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method ArticleCategory getModel()
|
* @method ArticleCategory getModel()
|
||||||
|
|
@ -18,4 +19,27 @@ class ArticleCategoryService extends AdminService
|
||||||
$list = $this->query()->orderByDesc('sort')->get()->toArray();
|
$list = $this->query()->orderByDesc('sort')->get()->toArray();
|
||||||
return array2tree($list);
|
return array2tree($list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function list()
|
||||||
|
{
|
||||||
|
return ['items' => $this->getTree()];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store($data): bool
|
||||||
|
{
|
||||||
|
$pid = data_get($data, 'parent_id');
|
||||||
|
if ($pid && $parent = ArticleCategory::find($pid)) {
|
||||||
|
$data['level'] = $parent->level + 1;
|
||||||
|
$data['path'] = $parent->path . $parent->id . '-';
|
||||||
|
} else {
|
||||||
|
$data['level'] = 1;
|
||||||
|
$data['path'] = '-';
|
||||||
|
}
|
||||||
|
return parent::store($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(string $ids): mixed
|
||||||
|
{
|
||||||
|
return $this->query()->whereIn($this->primaryKey(), explode(',', $ids))->delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,10 @@ return new class extends Migration
|
||||||
$table->unsignedTinyInteger('is_enable')->default(1)->comment('显示开关');
|
$table->unsignedTinyInteger('is_enable')->default(1)->comment('显示开关');
|
||||||
$table->unsignedInteger('sort')->default(0)->comment('排序');
|
$table->unsignedInteger('sort')->default(0)->comment('排序');
|
||||||
|
|
||||||
//可能用到的额外字段
|
// 可能用到的额外字段
|
||||||
$table->string('cover')->nullable()->comment('封面');
|
$table->string('cover')->nullable()->comment('封面');
|
||||||
$table->string('author')->nullable()->comment('作者/来源');
|
$table->string('author')->nullable()->comment('作者/来源');
|
||||||
|
$table->string('category_path')->nullable()->comment('上级分类');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -188,4 +188,8 @@ return [
|
||||||
'selected_rows_no_data' => '请选择要导出的数据',
|
'selected_rows_no_data' => '请选择要导出的数据',
|
||||||
'please_install_laravel_excel' => '请先安装 laravel-excel 扩展',
|
'please_install_laravel_excel' => '请先安装 laravel-excel 扩展',
|
||||||
],
|
],
|
||||||
|
'switch' => [
|
||||||
|
'on' => '开启',
|
||||||
|
'off' => '关闭',
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => 'ID',
|
||||||
|
'name' => '名称',
|
||||||
|
'icon' => '图片',
|
||||||
|
'sort' => '排序',
|
||||||
|
'is_enable' => '状态',
|
||||||
|
'created_at' => '创建时间',
|
||||||
|
];
|
||||||
Loading…
Reference in New Issue