Laravel 11 角色和权限4--文章模块

新建模型文件

go 复制代码
php artisan make:model Article -m

编写迁移文件

Database/Migrations/2024_12_13_075513_create_articles_table.php

lua 复制代码
public function up(): void
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('text')->nullable();
        $table->string('author');
        $table->timestamps();
    });
}

执行迁移文件

复制代码
php artisan migrate

创建文章控制器

go 复制代码
php artisan make:controller ArticleController -r

App/Http/Controllers/ArticleController.php

php 复制代码
<?php

namespace App\Http\Controllers;

use App\Models\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ArticleController extends Controller
{
    /**
     * 文章首页
     */
    public function index()
    {
        $articles = Article::latest()->paginate(25);
        return view('articles.list', compact('articles'));
    }

    /**
     * 新增文章页面
     */
    public function create()
    {
        return view('articles.create');
    }

    /**
     * 执行文章新增
     */
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|min:20',
            'author' => 'required|min:3',
        ]);

        if ($validator->passes()) {
            $article = new Article();
            $article->title = $request->title;
            $article->text = $request->text;
            $article->author = $request->author;
            $article->save();

            return redirect()->route('articles.index')->with('success', '文章添加成功~~');
        } else {
            return redirect()->route('articles.create')->withErrors($validator)->withInput();
        }
    }

    /**
     * 文章编辑页面
     */
    public function edit(string $id)
    {
        $article = Article::findOrFail($id);
        return view('articles.edit', compact('article'));
    }

    /**
     * 执行文章编辑
     */
    public function update(Request $request, string $id)
    {
        $article = Article::findOrFail($id);

        $validator = Validator::make($request->all(), [
            'title' => 'required|min:20',
            'author' => 'required|min:3',
        ]);

        if ($validator->passes()) {
            $article->title = $request->title;
            $article->text = $request->text;
            $article->author = $request->author;
            $article->save();

            return redirect()->route('articles.index')->with('success', '文章编辑成功~~');
        } else {
            return redirect()->route('articles.edit')->withErrors($validator)->withInput();
        }
    }

    /**
     * 删除
     */
    public function destroy(Request $request)
    {
        $article = Article::find($request->id);

        if ($article == null) {
            session()->flash('error', '未找到权限~');
            return response()->json([
                'status' => false
            ]);
        }

        $article->delete();
        session()->flash('success', '文章删除成功~');
        return response()->json([
            'status' => true
        ]);

    }
}

文章首页

resources/views/articles/list.blade.php

xml 复制代码
<x-app-layout>
    <x-slot name="header">
        <div class="flex justify-between">
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                {{ __('文章列表') }}
            </h2>
            <a href="{{ route('articles.create') }}"
               class="bg-slate-700 text-sm rounded-md text-white px-3 py-2">新增</a>
        </div>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            {{-- 表单成功验证 --}}
            <x-message></x-message>

            <table class="w-full">
                <thead class="bg-gray-50">
                <tr class="border-b">
                    <th class="px-6 py-3 text-left" width="60">#</th>
                    <th class="px-6 py-3 text-left">标题</th>
                    <th class="px-6 py-3 text-left">作者</th>
                    <th class="px-6 py-3 text-left" width="180">创建时间</th>
                    <th class="px-6 py-3 text-center" width="180">操作</th>
                </tr>
                </thead>
                <tbody class="bg-white">

                @if($articles->isNotEmpty())
                    @foreach($articles as $article)
                        <tr class="border-b">
                            <td class="px-6 py-3 text-left">{{$article->id}}</td>
                            <td class="px-6 py-3 text-left">{{$article->title}}</td>
                            <td class="px-6 py-3 text-left">{{$article->author}}</td>
                            <td class="px-6 py-3 text-left">{{$article->created_at}}</td>
                            <td class="px-6 py-3 text-center">
                                <a href="{{ route('articles.edit',$article->id) }}"
                                   class="bg-slate-700 text-sm rounded-md text-white px-3 py-2 hover:bg-slate-600">编辑</a>
                                <a href="javascript:void(0);" onclick="deletePermission({{$article->id}})"
                                   class="bg-red-600 text-sm rounded-md text-white px-3 py-2 hover:bg-red-500">删除</a>
                            </td>
                        </tr>
                    @endforeach
                @endif

                </tbody>
            </table>
            <div class="my-3">
                {{--分页--}}
                {{$articles->links()}}
            </div>
        </div>
    </div>

    <x-slot name="script">
        <script type="text/javascript">
            {{--AJAX文章删除--}}
            function deletePermission(id) {
                if (confirm("您确定要删除么~~")) {
                    $.ajax({
                        url: '{{ route('articles.destroy') }}',
                        type: 'delete',
                        data: {id: id},
                        dataType: 'json',
                        headers: {
                            'x-csrf-token': '{{ csrf_token() }}'
                        },
                        success: function (response) {
                            window.location.href = '{{ route('articles.index') }}';
                        }
                    });
                }
            }
        </script>
    </x-slot>
</x-app-layout>

新增页面

resources/views/articles/list.blade.php

ini 复制代码
<x-app-layout>
    <x-slot name="header">
        <div class="flex justify-between">
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                文章 / 新增
            </h2>
            <a href="{{ route('articles.index') }}"
               class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">权限列表</a>
        </div>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 text-gray-900">

                    <form action="{{ route('articles.store') }}" method="post">
                        @csrf

                        <div>
                            <label for="" class="text-sm font-medium">标题</label>
                            <div class="my-3">
                                <input value="{{old('title')}}" name="title" placeholder="请输入标题" type="text"
                                       class="border-gray-300 shadow-sm w-1/2 rounded-lg">

                                @error('title')
                                <p class="text-red-400 font-medium">{{ $message }}</p>
                                @enderror

                            </div>

                            <label for="" class="text-sm font-medium">内容</label>
                            <div class="my-3">
                                <textarea name="text" placeholder="请输入内容" id="text" class="border-gray-300 shadow-sm w-1/2 rounded-lg"
                                          cols="30" rows="10">{{old('text')}}</textarea>
                            </div>

                            <label for="" class="text-sm font-medium">作者</label>
                            <div class="my-3">
                                <input value="{{old('author')}}" name="author" placeholder="请输入作者" type="text"
                                       class="border-gray-300 shadow-sm w-1/2 rounded-lg">

                                @error('author')
                                <p class="text-red-400 font-medium">{{ $message }}</p>
                                @enderror

                            </div>

                            <button class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">新增</button>
                        </div>
                    </form>

                </div>
            </div>
        </div>
    </div>
</x-app-layout>

编辑页面

resources/views/articles/edit.blade.php

ini 复制代码
<x-app-layout>
    <x-slot name="header">
        <div class="flex justify-between">
            <h2 class="font-semibold text-xl text-gray-800 leading-tight">
                文章 / 编辑
            </h2>
            <a href="{{ route('articles.index') }}"
               class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">权限列表</a>
        </div>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
            <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
                <div class="p-6 text-gray-900">

                    <form action="{{ route('articles.update',$article->id) }}" method="post">
                        @csrf

                        <div>
                            <label for="" class="text-sm font-medium">标题</label>
                            <div class="my-3">
                                <input value="{{old('title',$article->title)}}" name="title" placeholder="请输入标题" type="text"
                                       class="border-gray-300 shadow-sm w-1/2 rounded-lg">

                                @error('title')
                                <p class="text-red-400 font-medium">{{ $message }}</p>
                                @enderror

                            </div>

                            <label for="" class="text-sm font-medium">内容</label>
                            <div class="my-3">
                                <textarea name="text" placeholder="请输入内容" id="text" class="border-gray-300 shadow-sm w-1/2 rounded-lg"
                                          cols="30" rows="10">{{old('text',$article->text)}}</textarea>
                            </div>

                            <label for="" class="text-sm font-medium">作者</label>
                            <div class="my-3">
                                <input value="{{old('author',$article->author)}}" name="author" placeholder="请输入作者" type="text"
                                       class="border-gray-300 shadow-sm w-1/2 rounded-lg">

                                @error('author')
                                <p class="text-red-400 font-medium">{{ $message }}</p>
                                @enderror

                            </div>

                            <button class="bg-slate-700 text-sm rounded-md text-white px-5 py-3">更新</button>
                        </div>
                    </form>

                </div>
            </div>
        </div>
    </div>
</x-app-layout>
相关推荐
咖啡八杯4 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
lizhongxuan5 小时前
AI Agent 上下文压缩利器 Headroom
后端
Csvn8 小时前
SSH 远程管理与安全加固 — 运维的守门之道
后端
IT_陈寒8 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
DigitalOcean9 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
菜鸟谢9 小时前
Rust 智能指针完整详解
后端
菜鸟谢9 小时前
Rust 函数完整知识点详解
后端
爱勇宝10 小时前
淡泊名利之前,先承认我们都很焦虑
前端·后端·程序员
菜鸟谢10 小时前
Rust 闭包(Closure)完整详解
后端
ServBay10 小时前
如何利用本地技术栈构建 0 成本 AI SaaS 雏形
后端·aigc·ai编程