利用Laravel实现内容管理系统(CMS)

CMS系统简介

CMS是Content Management System的缩写,意为“内同管理系统”。
CMS一般分为两个部分:前端展示和后端管理

利用laragon快速建立工程

1.打开laragon软件,点击菜单;
2.选择快速创建laravel,项目名称为cms;
3.创建完成后,在浏览器中访问。

XDebug调试工具

XDebug是一个PHP环境下的调试工具,利用它可以轻松的在浏览器和PHPStorm中实现的打断点、单步调试、观察变量值等调试功能。

XDebug调试环境安装

1.在largon中安装和配置xdebug扩展
启动Largon,在浏览器访问 http://localhost/?q=info

将上述页面全部内容拷贝下来,粘贴到https://xdebug.org/wizard的框框中;

点击analyse…按钮生成安装步骤,这里只做前2个。步骤2的路径是根据php配置路径来安装。将php_xdebug-2.9.6-7.2-vc15-x86_64.dll放入之后,打开laragon

修改php.ini,在最后面加入
[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
表示远程调试自动启动2.在chrome浏览器安装xdebug插件33.安装完成后,在cms中找到routes下的web.php,打上断点并打开监听模式,浏览器中开启xdebug

用户认证

laravel提供了开箱即用的认证方式
可参考文档地址:https://laravel.com/docs/7.x/authention
在工程目录下执行:
composer require laravel/ui (导入依赖包)
php artisan ui vue --auth (安装部署认证组件)
npm install && npm run dev (安装部署npm组件)
注册前需要创建数据库,在(.env)中修改数据库名称和密码,数据库创建完成后,创建表单,表单已在迁徙文件中

所以只需要在项目管理器中执行:PHP artisan migrate 创建完成后,可在注册页面进行注册

帖子和分类管理

创建模型和数据库迁徙文件

执行:php artisan make:model Category -m(模型和迁徙文件一步到位),在migrations中新建了一个文件。分类只是多了一个名称字段: $table->string(‘name’);先把表创建好:php artisan migrate
phpartisan make:model Post -m(先Category后Post)
包括标题、描述类、内容、图片、发布时间、相关联分类(暂未做)
post是CMS中后台发布文章的帖子
Category是文章的分类

调整app布局

调整后布局截图,在左边加一个固定的目录导航栏,但要求login页面保持原有布局。

在views中layouts里面的app.blade.php修改;
上面为导航栏部分,下面为主体内容(未认证时的页面)。
判断有没有认证
可用@auth指令

创建控制器

执行:php artisan make:controller CaategoriesController --resource;–resource选项让创建控制器和相关方法一步到位。
控制器创建完成后,创建路由,在web.php中添加增删查找路由后:Route::resource(‘categories’,‘CategoriesController’);再管理器中执行:php artisan route:list,会自动增加路由创建列表页:在views下面新建一个子目录categories,在子目录里添加一个index.blade.php文件,写完之后记得在控制器中返回实现创建页:在子目录里添加一create.blade.php文件,内容基本与index.blade.php文件中相同,多了一个错误处理和输入框。在控制器中验证字段,重定向到链接地址成功信息一般在网页布局里展示(app.blade.php)
要实现输入内容错误但不完全清除。在创建页(create.blade.php)添加一个字段:value="{{old(‘name’)}}。要使提示消息显示中文可以用’required’=>’:attribute必填’,也可以用’name.min’=>‘名称不能少于:min个字符’,保存唯一性可以用unique:categories。
表单请求:php artisan make:request CategoryStoreCategory
php artisan make:request Category/UpdateCategory

代码

index.blade.php

{{--要用到布局文件--}}
@extends('layouts.app'){{--实现内容部分--}}
@section('content')
{{--  实现卡片--}}
<div class="card"><div class="card-header d-flex justify-content-between align-items-center"><strong>分类列表</strong><a href="{{route('categories.create')}}" class="btn btn-primary btn-sm">新建分类</a></div><div class="card-body"><table class="table"><thead><tr><th width="120">序号</th><th>分类名称</th><th width="200">操作</th></tr></thead><tbody>@foreach($categories as $i =>$categories)<tr><td>{{$i +1}}</td><td>{{$category->name}}</td><td><a href="{{route('categories.edit',$category->id)}}" class="btn btn-info btn-sm">编辑</a><a onclick="deleteCategory('{{route('categories.destory',$category->id)}}','{{$category->name}}')"class="byn btn-danger btn-sm">删除</a></td></tr></tbody></table></div></div><!-- Modal -->
<div class="modal fade" id="delCategoryDlg" data-backdrop="static" tabindex="-1" role="dialog" aria-labelledby="staticBackdropLabel" aria-hidden="true"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="delCategoryDlgLable">删除确认</h5><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button></div><div class="modal-body"><form id="delCategoryForm" action="" method="post">@method('delete')@csrf<div class="form-group">您确定要删除<strong></strong>分类吗?</div><div class="form-group"><button type="submit" class="btn btn-primary">确定</button><button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button></div></form></div></div></div>
</div>@endsection@section('script')<script>function deleteCategory(delUrl,name){var delCategoryForm = document.getElementById('delCategoryForm');var categoryName = document.getElementById('categoryName');delCategoryForm.action = delUrl;categoryName.innerText = name;$('delCategoryDlg').modal('show');}</script>@endsection

create.blade.php

{{--要用到布局文件--}}
@extends('layouts.app')
{{--实现内容部分--}}
@section('content')
{{--  实现卡片--}}<div class="card"><div class="card-header d-flex justify-content-between align-items-center"><strong>{{isset($category)?'编辑分类':'创建分类'}}</strong></div><div class="card-body"><form action="{{isset($category)?route('categories.update',$category->id):route('categories.store')}}"method="post">
{{--                防止跨站使用文章--}}@csrf@if(isset($category))@method('patch')@endif<div class="form-group"><label for="name">分类名称</label><input type="text" name="name" value="{{old('name'),isset($category)?$category->naem:''}}"id="name" class="form-control @error('name') is-invalid @enderror"placeholder="请填写分类名称....">
{{--                    出错处理--}}@if($errors->any())<div class="invalid-feedback">@foreach($errors->all() as $error){{$error}}@endforeach</div>@endif</div><div class="form-group"><button type="submit" class="btn btn-primary">{{isset($category)?'更新':'创建'}}</button></div></form></div><div class="card-footer text-muted"></div></div>@endsection

app.blade.php

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- CSRF Token --><meta name="csrf-token" content="{{ csrf_token() }}"><title>{{ config('app.name', 'Laravel') }}</title><!-- Scripts --><script src="{{ asset('js/app.js') }}" defer></script><!-- Fonts --><link rel="dns-prefetch" href="//fonts.gstatic.com"><link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet"><!-- Styles --><link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body><div id="app"><nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm"><div class="container"><a class="navbar-brand" href="{{ url('/') }}">{{ config('app.name', 'Laravel') }}</a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><!-- Left Side Of Navbar --><ul class="navbar-nav mr-auto"></ul><!-- Right Side Of Navbar --><ul class="navbar-nav ml-auto"><!-- Authentication Links -->@guest<li class="nav-item"><a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a></li>@if (Route::has('register'))<li class="nav-item"><a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a></li>@endif@else<li class="nav-item dropdown"><a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>{{ Auth::user()->name }} <span class="caret"></span></a><div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown"><a class="dropdown-item" href="{{ route('logout') }}"onclick="event.preventDefault();document.getElementById('logout-form').submit();">{{ __('Logout') }}</a><form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">@csrf</form></div></li>@endguest</ul></div></div></nav><main class="py-4">@auth<div class="container">@if(session()->has('success'))<div class="alert alert-success alert-dismissible fade show" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>{{session('success')}}</div>@endif<div class="row"><div class="col-md-4"><div class="list-group"><a href="#" class="list-group-item list-group-item-action ">Post</a><a href="#" class="list-group-item list-group-item-action">Categories</a></div></div><div class="col-md-8">@yield('content')</div></div></div>@else@yield('content')@endauth</main></div>
@yield('script')
</body>
</html>

CategoriesController.php

<?phpnamespace App\Http\Controllers;
use APP\Category;
use App\Http\Requests\Category\UpdateCategory;
use Illuminate\Http\Request;class CategoriesController extends Controller
{/*** Display a listing of the resource.** @return \Illuminate\Http\Response*/public function index(){//return view('categories.index');}/*** Show the form for creating a new resource.** @return \Illuminate\Http\Response*/public function create(){//return view('categories.create');}/*** Store a newly created resource in storage.** @param  \Illuminate\Http\Request  $request* @return \Illuminate\Http\Response*/public function store(StoreCategory $request){Category::create($request->all());$request->session()->flash('success','分类创建成功!');
//重定向到链接地址return redirect(route('categories.index'));}/*** Display the specified resource.** @param  int  $id* @return \Illuminate\Http\Response*/public function show($id){//}/*** Show the form for editing the specified resource.** @param  int  $id* @return \Illuminate\Http\Response*/public function edit(Category $category){//return view('categories.create',compact('category'));}/*** Update the specified resource in storage.** @param  \Illuminate\Http\Request  $request* @param  int  $id* @return \Illuminate\Http\Response*/public function update(UpdateCategory $request,Category $category){//$category->update($request->validated());$request->session()->flash('success','分类更新成功!');return redirect(route('categories.index'));}/*** Remove the specified resource from storage.** @param  int  $id* @return \Illuminate\Http\Response*/public function destroy(Category $category){//$category->delete();session()->flash('success','分类删除成功!');return redirect(route('categories.index'));}
}

Category.php

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Category extends Model
{//protected $fillable =['name'];
}

UpdateCategory.php

<?phpnamespace App\Http\Requests\Category;use Illuminate\Foundation\Http\FormRequest;class UpdateCategory extends FormRequest
{/*** Determine if the user is authorized to make this request.** @return bool*/public function authorize(){return true;}/*** Get the validation rules that apply to the request.** @return array*/public function rules(){return [//'name' => 'required|min:3|max:20|unique:categories'];}public function messages(){return ['required' =>':attribute必填','name.min' =>'名称不能小于:min个字符','name.max' =>'名称不能小于:max个字符','name.unique' =>'分类名称 <strong>:input</strong> 已存在'];}
}

StoreGategory.php

<?phpnamespace App\Http\Requests\Category;use Illuminate\Foundation\Http\FormRequest;class StoreCategory extends FormRequest
{/*** Determine if the user is authorized to make this request.** @return bool*/public function authorize(){return true;}/*** Get the validation rules that apply to the request.** @return array*/public function rules(){return [//'name' => 'required|min:3|max:20|unique:categories'];}public function messages(){return ['required' =>':attribute必填','name.min' =>'名称不能小于:min个字符','name.max' =>'名称不能小于:max个字符','name.unique' =>'分类名称 <strong>:input</strong> 已存在'];}
}

利用Laravel实现内容管理系统(CMS)相关推荐

  1. laravel开源php棋牌,Simpla: Simpla 是基于 Laravel 的 PHP 框架进行开发的一款开源免费的内容管理系统(CMS)...

    ###Simpla Simpla是基于Laravel的PHP框架进行开发的一款开源免费的内容管理系统(CMS),基于GUN开源协议. Simpla实现了一些基础功能,采用主题和模块的方式进行功能上的扩 ...

  2. Lerx开源网站内容管理系统(CMS) v6.5 以Java+MySQL进行开发的内容管理系统源码

    介绍 Lerx 开源网站内容管理系统(CMS)是一个以Java+MySQL进行开发的内容管理系统源码. Lerx 开源网站内容管理系统(CMS)特点: 1.跨平台设计,能无差别运行于Windows.L ...

  3. 我的内容管理系统(CMS)寻找历程 -- Mambo出鞘,谁与争锋?

    浪三 Mambo中国mambochina.net 如果你也象我一样,一直苦苦寻找合适的网站内容管理系统,那么本文可作为一个参考. 在为时半年的漫漫内容管理系统寻找历程中,Drupal.Tikiwiki ...

  4. 内容管理系统(CMS)的设计和选型

    J2EE相关: 内容管理系统(CMS)的设计和选型 发表于 Tuesday, July 27 @ 11:36:07 CST by joezxh joe.zhang 投递 "作者: 车东 Em ...

  5. 动态可缓存的内容管理系统(CMS)

    关键词:cache squid 动态可缓存内容管理系统 内容管理系统 CMS 摘要:内容管理系统(CMS)在各大商业站点和门户站点中扮演着重要的角色,是内容有效组织和快速发布极为重要的基础平台.目前主 ...

  6. 手机导航列表页面瀑布流图片无限加载代码_搭建内容管理系统CMS(3):从原理、需求到设计,一文看懂动态化页面...

    Sue前面分享的两篇文章,介绍了内容管理系统(CMS)关于内容生产和内容过滤的部分.那么被生产出来并通过过滤的内容,如何呈现给我们的内容消费者呢? 我们都知道,在客户端上的开发实现,版本一旦发布了出去 ...

  7. 内容管理系统CMS简介

    1.CMS简介 CMS是Content Management System的缩写,意为"内容管理系统". 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场.对于 ...

  8. ASP.NET 5个著名内容管理系统CMS

    原:http://www.open-open.com/news/view/781ca6 1. N2CMS是由C#编写的一个CMS 开源框架,它是一个轻量级的CMS网站解决方案,支持多种数据库,包括MS ...

  9. 搭建WordPres网站(博客网站/内容管理系统-CMS)

    一.WordPress简介 WordPress是使用PHP语言开发的博客平台,在支持PHP和MySQL数据库的服务器上,您可以用WordPress架设自己的网站,也可以用作内容管理系统(CMS).建站 ...

最新文章

  1. Makefile学习笔记 - 我的CPP之路 - C++博客
  2. 什么是 Python 的 「内存管理机制」?
  3. 好程序员web前端分享DIV+CSS3和html5+CSS3有什么区别
  4. 测试——设计思维之获取反馈
  5. mysql 截取字符串部分值,Mysql字符串截取_获取指定字符串中的数据
  6. XL, an extensible programming language, implements concept programming
  7. 产品经理业务流程图的绘制流程分享
  8. 【iOS开发】更改App图标下方显示的名称
  9. YII with()
  10. linux防火墙常用相关操作
  11. easyui 扩展loading
  12. 返回顶部php代码,页面按需返回顶部代码及注释说明
  13. 问题贴 jQuery插件nicescroll问题
  14. 车载前视摄像头学习笔记 ———— 环境影响
  15. iVMS-8700综合安防管理平台第三方开发
  16. ap计算机知识点总结,AP统计学考试知识点汇总
  17. “百度搜索框提示”代码
  18. Chrome 翻译插件规避代码块
  19. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.3
  20. 互联网人典型体检报告?

热门文章

  1. 计算机毕业设计Java-ssmNBA论坛系统源码+系统+数据库+lw文档
  2. matlab循环遍历数组_matlab循环语句for怎么用
  3. GIT常用命令大全——赶紧收藏
  4. ChatGPT在现代工作场景中的应用及潜力分析
  5. 2019牛客国庆集训派对day7 A 2016
  6. TCP/IP四层模型简单介绍
  7. 流式双染凋亡率的计算_Annexin V-FITC/PI双染细胞凋亡检测方法
  8. chrome代理插件下载安装
  9. 烤仔TVの尚书房 | 对话 Chainlink 条子哥 共话 DeFi 狂热下的冷静
  10. 核密度估计和非参数回归