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>
相关推荐
sg_knight15 分钟前
Spring 框架中的 SseEmitter 使用详解
java·spring boot·后端·spring·spring cloud·sse·sseemitter
喵个咪3 小时前
初学者入门:用 go-kratos-admin + protoc-gen-typescript-http 快速搭建企业级 Admin 系统
后端·typescript·go
用户21411832636025 小时前
手把手教你用Claude制作专属PPT生成器-从模板学习到自动生成全流程实战
后端
计算机毕设匠心工作室7 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
摆烂工程师7 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
qq_12498707537 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
代码与野兽7 小时前
AI交易,怎么让LLM自己挑选数据源?
前端·javascript·后端
天天摸鱼的java工程师8 小时前
JDK 25 到底更新了什么?这篇全景式解读带你全面掌握
java·后端
非鱼feiyu8 小时前
自关联数据表查询优化实践:以 Django + 递归 CTE 构建树结构为例
数据库·后端·django
零日失眠者8 小时前
这5个Python库一旦掌握就离不开
后端·python