利用Laravel实现内容管理系统(CMS)
利用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插件3
3.安装完成后,在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">×</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">×</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)相关推荐
- laravel开源php棋牌,Simpla: Simpla 是基于 Laravel 的 PHP 框架进行开发的一款开源免费的内容管理系统(CMS)...
###Simpla Simpla是基于Laravel的PHP框架进行开发的一款开源免费的内容管理系统(CMS),基于GUN开源协议. Simpla实现了一些基础功能,采用主题和模块的方式进行功能上的扩 ...
- Lerx开源网站内容管理系统(CMS) v6.5 以Java+MySQL进行开发的内容管理系统源码
介绍 Lerx 开源网站内容管理系统(CMS)是一个以Java+MySQL进行开发的内容管理系统源码. Lerx 开源网站内容管理系统(CMS)特点: 1.跨平台设计,能无差别运行于Windows.L ...
- 我的内容管理系统(CMS)寻找历程 -- Mambo出鞘,谁与争锋?
浪三 Mambo中国mambochina.net 如果你也象我一样,一直苦苦寻找合适的网站内容管理系统,那么本文可作为一个参考. 在为时半年的漫漫内容管理系统寻找历程中,Drupal.Tikiwiki ...
- 内容管理系统(CMS)的设计和选型
J2EE相关: 内容管理系统(CMS)的设计和选型 发表于 Tuesday, July 27 @ 11:36:07 CST by joezxh joe.zhang 投递 "作者: 车东 Em ...
- 动态可缓存的内容管理系统(CMS)
关键词:cache squid 动态可缓存内容管理系统 内容管理系统 CMS 摘要:内容管理系统(CMS)在各大商业站点和门户站点中扮演着重要的角色,是内容有效组织和快速发布极为重要的基础平台.目前主 ...
- 手机导航列表页面瀑布流图片无限加载代码_搭建内容管理系统CMS(3):从原理、需求到设计,一文看懂动态化页面...
Sue前面分享的两篇文章,介绍了内容管理系统(CMS)关于内容生产和内容过滤的部分.那么被生产出来并通过过滤的内容,如何呈现给我们的内容消费者呢? 我们都知道,在客户端上的开发实现,版本一旦发布了出去 ...
- 内容管理系统CMS简介
1.CMS简介 CMS是Content Management System的缩写,意为"内容管理系统". 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场.对于 ...
- ASP.NET 5个著名内容管理系统CMS
原:http://www.open-open.com/news/view/781ca6 1. N2CMS是由C#编写的一个CMS 开源框架,它是一个轻量级的CMS网站解决方案,支持多种数据库,包括MS ...
- 搭建WordPres网站(博客网站/内容管理系统-CMS)
一.WordPress简介 WordPress是使用PHP语言开发的博客平台,在支持PHP和MySQL数据库的服务器上,您可以用WordPress架设自己的网站,也可以用作内容管理系统(CMS).建站 ...
最新文章
- Makefile学习笔记 - 我的CPP之路 - C++博客
- 什么是 Python 的 「内存管理机制」?
- 好程序员web前端分享DIV+CSS3和html5+CSS3有什么区别
- 测试——设计思维之获取反馈
- mysql 截取字符串部分值,Mysql字符串截取_获取指定字符串中的数据
- XL, an extensible programming language, implements concept programming
- 产品经理业务流程图的绘制流程分享
- 【iOS开发】更改App图标下方显示的名称
- YII with()
- linux防火墙常用相关操作
- easyui 扩展loading
- 返回顶部php代码,页面按需返回顶部代码及注释说明
- 问题贴 jQuery插件nicescroll问题
- 车载前视摄像头学习笔记 ———— 环境影响
- iVMS-8700综合安防管理平台第三方开发
- ap计算机知识点总结,AP统计学考试知识点汇总
- “百度搜索框提示”代码
- Chrome 翻译插件规避代码块
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.3
- 互联网人典型体检报告?