progress save
This commit is contained in:
parent
9c430b9593
commit
12f67c4e4e
|
@ -9,6 +9,7 @@ use Illuminate\Support\Arr;
|
||||||
class Article extends Model
|
class Article extends Model
|
||||||
{
|
{
|
||||||
protected $table = 'articles';
|
protected $table = 'articles';
|
||||||
|
protected $fillable = [ 'title', 'slug', 'body' ];
|
||||||
|
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
|
||||||
|
@ -23,4 +24,22 @@ class Article extends Model
|
||||||
return $article;
|
return $article;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static function findById(string $id): array
|
||||||
|
{
|
||||||
|
$article = Arr::first(Article::all(), fn($article) => $article['id'] === $id);
|
||||||
|
|
||||||
|
if(! $article ) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $article;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function user_id()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(User::class);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Tag extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
}
|
|
@ -44,4 +44,9 @@ class User extends Authenticatable
|
||||||
'password' => 'hashed',
|
'password' => 'hashed',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function articles()
|
||||||
|
{
|
||||||
|
return $this->hasMany(Article::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Tag>
|
||||||
|
*/
|
||||||
|
class TagFactory extends Factory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Define the model's default state.
|
||||||
|
*
|
||||||
|
* @return array<string, mixed>
|
||||||
|
*/
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,16 +13,17 @@ return new class extends Migration
|
||||||
{
|
{
|
||||||
Schema::create('articles', function (Blueprint $table) {
|
Schema::create('articles', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('slug');
|
$table->string('slug')->unique();
|
||||||
$table->string('title');
|
$table->string('title');
|
||||||
$table->text('body');
|
$table->text('body');
|
||||||
$table->integer('category');
|
$table->integer('user_id')->references('id')->on('users');
|
||||||
|
$table->integer('category')->references('id')->on('categories');
|
||||||
$table->boolean('is_collection');
|
$table->boolean('is_collection');
|
||||||
$table->integer('tag_1');
|
$table->integer('tag_1')->references('id')->on('tags');
|
||||||
$table->integer('tag_2');
|
$table->integer('tag_2')->references('id')->on('tags');
|
||||||
$table->integer('tag_3');
|
$table->integer('tag_3')->references('id')->on('tags');
|
||||||
$table->integer('tag_4');
|
$table->integer('tag_4')->references('id')->on('tags');
|
||||||
$table->integer('tag_5');
|
$table->integer('tag_5')->references('id')->on('tags');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('categories', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('name');
|
||||||
|
$table->string('color');
|
||||||
|
$table->integer('order_id');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('categories');
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('tags', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('name');
|
||||||
|
$table->string('color');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
Schema::create('article_tag', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignIdFor(\App\Models\Article::class, 'articles');
|
||||||
|
$table->foreignIdFor(\App\Models\Tag::class);
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('tags');
|
||||||
|
}
|
||||||
|
};
|
|
@ -575,6 +575,7 @@ ul > li::before
|
||||||
; padding : 0.5rem
|
; padding : 0.5rem
|
||||||
; border-radius : 0.5rem
|
; border-radius : 0.5rem
|
||||||
; justify-content : center
|
; justify-content : center
|
||||||
|
; align-items : center
|
||||||
; min-width: 16rem
|
; min-width: 16rem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,17 @@
|
||||||
{{ $attributes->merge() }}
|
{{ $attributes->merge() }}
|
||||||
>
|
>
|
||||||
|
|
||||||
|
@elseif( 'checkbox' == $attributes['type'] )
|
||||||
|
<div class="x-input"
|
||||||
|
title="{{ $attributes['title'] ?? $slot }}"
|
||||||
|
>
|
||||||
|
<input type="checkbox" name="{{ $slug }}"
|
||||||
|
{{ $attributes['value'] ? 'checked="checked"' : '' }}
|
||||||
|
>
|
||||||
|
<label for={{ $slug }}></label>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
@elseif( 'textarea' == $attributes['type'] )
|
@elseif( 'textarea' == $attributes['type'] )
|
||||||
|
|
||||||
<div class="x-input"
|
<div class="x-input"
|
||||||
|
|
|
@ -1,15 +1,33 @@
|
||||||
<x-layout-dashboard>
|
<x-layout-dashboard>
|
||||||
|
|
||||||
<form class="col c w-30" method="post" name="edit_form" action="/edit">
|
<form class="col c w-30" method="post" action="/edit">
|
||||||
@csrf
|
@csrf
|
||||||
<x-input name="id" type="hidden"
|
<x-input type="hidden" value="{{ $id ?? 0 }}">id</x-input>
|
||||||
value="{{ $id ?? 0 }}">
|
<x-input class="w-30" value="{{ $title ?? '' }}">title</x-input>
|
||||||
<x-input name="title" class="w-30"
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
value="{{ $title ?? '' }}">
|
|
||||||
<x-input name="slug" class="w-30" pattern="[A-Za-z0-9-]+"
|
|
||||||
value="{{ $slug ?? '' }}"
|
value="{{ $slug ?? '' }}"
|
||||||
required>
|
required>slug</x-input>
|
||||||
<textarea name="body" class="w-30">{{ $body ?? '' }}</textarea>
|
<x-input type="textarea" class="w-30"
|
||||||
|
value="{{ $body ?? '' }}"
|
||||||
|
>body</x-input>
|
||||||
|
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $category ?? '' }}">category</x-input>
|
||||||
|
|
||||||
|
<x-input type="checkbox" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $is_collection ?? '' }}">is_collection</x-input>
|
||||||
|
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $tag_1 ?? '' }}">tag_1</x-input>
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $tag_2 ?? '' }}">tag_2</x-input>
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $tag_3 ?? '' }}">tag_3</x-input>
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $tag_4 ?? '' }}">tag_4</x-input>
|
||||||
|
<x-input class="w-30" pattern="[A-Za-z0-9-]+"
|
||||||
|
value="{{ $tag_5 ?? '' }}">tag_5</x-input>
|
||||||
|
|
||||||
<button type="submit">Save</button>
|
<button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,21 @@ Route::view('/notes', 'notes');
|
||||||
Route::get('/new', function () {
|
Route::get('/new', function () {
|
||||||
return view('new');
|
return view('new');
|
||||||
});
|
});
|
||||||
|
Route::post('/new', function (string $title = '', string $slug = '', string $body = '') {
|
||||||
|
$article = Article::create(
|
||||||
|
[ 'title' => $title
|
||||||
|
, 'slug' => $slug
|
||||||
|
, 'body' => $body
|
||||||
|
]);
|
||||||
|
|
||||||
|
return view('edit',
|
||||||
|
[ 'article' => $article
|
||||||
|
, 'title' => $article['title']
|
||||||
|
, 'slug' => $article['slug']
|
||||||
|
, 'body' => $article['body']
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
Route::get('/edit/{slug}', function (string $slug) {
|
Route::get('/edit/{slug}', function (string $slug) {
|
||||||
$article = Article::find($slug);
|
$article = Article::find($slug);
|
||||||
|
@ -36,6 +51,19 @@ Route::get('/edit/{slug}', function (string $slug) {
|
||||||
]);
|
]);
|
||||||
})->where('slug', '[A-Za-z0-9-]+');
|
})->where('slug', '[A-Za-z0-9-]+');
|
||||||
|
|
||||||
|
Route::post('/edit/{id}', function (string $id) {
|
||||||
|
$article = Article::findById($id);
|
||||||
|
|
||||||
|
return view('edit',
|
||||||
|
[ 'article' => $article
|
||||||
|
, 'title' => $article['title']
|
||||||
|
, 'slug' => $article['slug']
|
||||||
|
, 'body' => $article['body']
|
||||||
|
]);
|
||||||
|
})->where('id', '[0-9-]+');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Route::get('/articles', function () {
|
Route::get('/articles', function () {
|
||||||
return view('articles', [
|
return view('articles', [
|
||||||
'articles' => Article::all(),
|
'articles' => Article::all(),
|
||||||
|
|
Loading…
Reference in New Issue