Laravel大型项目系列教程:多用户博客系统(一)
上传者:梁泽环|上传时间:2016-08-29|密次下载
Laravel大型项目系列教程:多用户博客系统(一)
一、课程概述
1.课程介绍
本教程将使用Laravel完成一个多用户的博客系统,大概会包含如下内容:
路由管理。
用户管理,如用户注册、修改信息、锁定用户等。
文章管理,如发表文章、修改文章等。
标签管理,文章会有一到多个标签。
数据库管理,如迁移、填充数据等。
Web表单验证。
Blade模版引擎。
分页处理。
安全处理。
单元测试。
部署到应用服务器Apache。
尽量保证每节教程完整并能运行,会在教程的最后附上这节教程的代码下载地址。
Tip:教程中必要的知识点都会有一个超链接
二、环境要求
- PHP 5.4+
- MySQL 5.1+
- Composer([中国镜像](http://pkg.phpcomposer.com/))
三、Let's go!
1.新建一个Laravel项目
使用如下命令创建一个名为blog的Laravel项目:
$ composer create-project laravel/laravel blog --prefer-dist
创建完成之后进入到blog目录,修改app/config/app.php中的timezone为RPC、locale为zh,然后在blog目录下启动它自带的开发服务器:
$ php artisan serveLaravel development server started on http://localhost:8000
打开浏览器输入localhost:8000,如果页面如下图就说明项目搭建完成了:
![]() |
2.安装插件
在composer.json中增加:
"require-dev": { "way/generators": "~2.0"},
运行composer update安装,完成后在app/config/app.php的providers中增加:
'WayGeneratorsGeneratorsServiceProvider'
运行php artisan是不是多了generate选项,它可以快速地帮我们创建想要的组件。
3.建立数据库
把app/config/database.php中connections下的mysql改成你自己的配置:
'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'blog', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '',),
需要在MySQL中先创建一个名为blog的数据库
配置完成之后,创建users表的数据库迁移文件:
$ php artisan migrate:make create_users_table --create=users
我们会发现在appdatabasemigrations下多了一个*_create_users_table.php文件,在这个文件中修改:
Schema::create('users', function(Blueprint $table){ $table->increments('id'); $table->string('email'); $table->string('password'); $table->string('nickname'); $table->boolean('is_admin')->default(0); $table->boolean('block')->default(0); $table->timestamps();});
之后进行数据库迁移:
$ php artisan migrate
你会惊讶地发现在数据库中多了两张表users和migrations,users表就是我们定义的表,migrations表记录了迁移的信息。
4.创建User模型
数据库迁移完成之后我们将使用Eloquent ORM,这是Laravel让人着迷的重要原因之一。我们会发现在appmodels下已经有一个User.php文件了,对其修改:
use IlluminateAuthUserInterface;
use IlluminateAuthUserTrait;
class User extends Eloquent implements UserInterface { use UserTrait; protected $table = 'users'; protected $hidden = array('password', 'remember_token'); protected $guard = array('email', 'password');
}
5.填充数据
有了User模型后,我们就可以向数据库填充数据了,在app/database/seeds下创建一个名为UsersSeeder.php的文件,增加如下:
class UsersSeeder extends Seeder { public function run() { User::create([ 'email' => 'admin@shiyanlou.com', 'password' => Hash::make(''), 'nickname' => 'admin', 'is_admin' => 1, ]); }}
然后在DatabaseSeeder.php中增加:
$this->call('UserTableSeeder');
之后就真正地向数据库填充数据:
$ php artisan db:seed
你可以查看数据库,会发现users表中多了一条记录。
详情可以查看Laravel中数据库的迁移和填充
6.创建视图模版
我们将使用Laravel中的Blade模版引擎,使用下面命令创建三个视图:
php artisan generate:view _layouts.default
php artisan generate:view _layouts.nav
php artisan generate:view _layouts.footer
php artisan generate:view index
之后你可以在app/views下发现多了一个index.blade.php和一个_layouts文件夹,在_layouts文件夹下有三个文件default.blade.php、footer.blade.php和nav.blade.php。我们将使用AmazeUI框架来做为前端框架,修改default.blade.php:
<!DOCTYPE html>
<html>
<head lang="zh">
<meta charset="UTF-8"/>
<title>ShiYanLou Blog</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no"/>
<meta name="renderer" content="webkit"/>
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<link rel="alternate icon" type="image/x-icon" href="{{ URL::asset('i/favicon.ico') }}"/>
<link rel="stylesheet" href="//cdn.amazeui.org/amazeui/2.1.0/css/amazeui.min.css"/>
{{ HTML::style('css/custom.css') }}
</head>
<body>
<header class="am-topbar am-topbar-fixed-top">
<div class="am-container">
<h1 class="am-topbar-brand">
<a href="/">ShiYanLou Blog</a>
</h1>
@include('_layouts.nav')
</div>
</header>
@yield('main')
@include('_layouts.footer')
<script src="//cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdn.amazeui.org/amazeui/2.1.0/js/amazeui.min.js"></script>
</body>
</html>
URL::asset('i/favicon.ico')会生成http://localhost:8000/i/favicon.ico,HTML::style('css/custom.css')会生成<link media="all" type="text/css" rel="stylesheet" href="http://localhost:8000/css/custom.css">,其中的i和css文件夹是放在public目录下的,public目录是项目的资源文件夹。@include('_layouts.nav')会包含app/views/_layouts/nav.blade.php文件,@yield('main')是用于模版继承的。
修改nav.blade.php:
<button class="am-topbar-btn am-topbar-toggle am-btn am-btn-sm am-btn-secondary am-show-sm-only" data-am-collapse="{target: '#collapse-head'}"><span class="am-sr-only">nav switch</span> <span class="am-icon-bars"></span></button><div class="am-collapse am-topbar-collapse" id="collapse-head"> <div class="am-topbar-right"> <a href="#" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a> </div></div>
修改footer.blade.php:
<footer class="footer"> <p>© 2015 By <a href="http://www.shiyanlou.com" target="_blank">www.shiyanlou.com</a></p></footer>
修改index.blade.php:
@extends('_layouts.default') @section('main')<div class="am-g am-g-fixed blog-g-fixed"> <div class="am-u-sm-12"> <h1>Welcome to ShiYanLou!</h1> </div></div>@stop
@extends('_layouts.default')会继承app/views/_layouts/default.blade.php文件,@yield('main')对应@section('main')并填充为其中的内容。
在public目录下新建两个文件夹i和css,在i文件夹里放置一个名为favicon.ico的图标,在css文件夹下新建一个名为custom.css的文件,修改如下:
.footer p { color: #7f8c8d; margin: 0; padding: 15px 0; text-align: center; background: #2d3e50;}.topbar-link-btn { color: #fff !important;}
7.修改路由访问首页
视图已经有了,这时候需要把路由跟视图进行关联,修改app/routes.php如下:
Route::get('/', function(){ return View::make('index');});
不出意外,这时候访问localhost:8000会出现下图这样:
![]() |
终于见到了亲手编写的第一个页面,是不是有点小激动啊?
8.创建登录视图
在nav.blade.php中修改登录超链接的地址:
<a href="{{ URL::to('login') }}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a>
URL::to('login')会生成http://localhost:8000/login这个地址。
创建login.blade.php:
$ php artisan generate:view login
修改login.blade.php:
@extends('_layouts.default')
@section('main')
<div class="am-g am-g-fixed">
<div class="am-u-lg-6 am-u-md-8">
<br/>
@if (Session::has('message'))
<div class="am-alert am-alert-danger" data-am-alert>
<p>{{ Session::get('message') }}</p>
</div>
@endif
@if ($errors->has())
<div class="am-alert am-alert-danger" data-am-alert>
<p>{{ $errors->first() }}</p>
</div>
@endif
{{ Form::open(array('url' => 'login', 'class' => 'am-form')) }}
{{ Form::label('email', 'E-mail:') }}
{{ Form::email('email', Input::old('email')) }}
<br/>
{{ Form::label('password', 'Password:') }}
{{ Form::password('password') }}
<br/>
<label for="remember_me">
<input id="remember_me" name="remember_me" type="checkbox" value="1">
Remember Me
</label>
<br/>
<div class="am-cf">
{{ Form::submit('Login', array('class' => 'am-btn am-btn-primary am-btn-sm am-fl')) }}
</div>
{{ Form::close() }}
<br/>
</div>
</div>
@stop
在routes.php中增加:
Route::get('login', function(){ return View::make('login');});
这时候访问localhost:8000/login或者点击导航条的Login按钮会出现下图这样:
![]() |
9.实现登录
创建用户登录后主页:
$ php artisan generate:view home
修改home.blade.php:
@extends('_layouts.default') @section('main')
<div class="am-g am-g-fixed blog-g-fixed"> <div class="am-u-sm-12"> <h1>Hello {{{ Auth::user()->nickname }}}</h1> </div>
</div>@stop
上面的{{{ }}}可以对字符串做转义处理,一定程度上避免XSS攻击。
修改nav.blade.php:
<div class="am-collapse am-topbar-collapse" id="collapse-head">
@if (Auth::check())
<ul class="am-nav am-nav-pills am-topbar-nav am-topbar-right">
<li class="am-dropdown" data-am-dropdown>
<a class="am-dropdown-toggle" data-am-dropdown-toggle href="javascript:;">
<span class="am-icon-users"></span> {{{ Auth::user()->nickname }}} <span class="am-icon-caret-down"></span>
</a>
<ul class="am-dropdown-content">
<li><a href="{{ URL::to('logout') }}"><span class="am-icon-power-off"></span> Exit</a></li>
</ul>
</li>
</ul>
@else
<div class="am-topbar-right">
<a href="{{ URL::to('login') }}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a>
</div>
@endif
</div>
在Routes.php中增加:
Route::post('login', array('before' => 'csrf', function(){ $rules = array( 'email' => 'required|email', 'password' => 'required|min:6', 'remember_me' => 'boolean', ); $validator = Validator::make(Input::all(), $rules); if ($validator->passes()) { if (Auth::attempt(array( 'email' => Input::get('email'), 'password' => Input::get('password'), 'block' => 0), (boolean) Input::get('remember_me'))) { return Redirect::intended('home'); } else { return Redirect::to('login')->withInput()->with('message', 'E-mail or password error'); } } else { return Redirect::to('login')->withInput()->withErrors($validator); }})); Route::get('home', array('before' => 'auth', function(){ return View::make('home');}));
下面就可以尝试用户登录了,如果输入信息有误,会出现错误信息如:
![]() |
登录成功后会出现下图这样:
![]() |
这里我们使用了Laravel自带的身份验证Auth,你也可以使用更加强大的Sentry,Web表单验证用了Validator,View和Redirect详细可以查看视图和响应文档,还使用了路由过滤器,csrf过滤器可以使我们轻松地防御csrf攻击。
10.退出登录
在routes.php中增加:
Route::get('logout', array('before' => 'auth', function(){ Auth::logout(); return Redirect::to('/');}));
现在你就可以实现退出功能了,点击Exit:
![]() |
退出后会跳转到主页。
11.小结
至此简单的用户登录功能就完成了,你除了要完成上述的例子外,还要完成记住我的功能哦!你可以通过下面途径来完成:
Laravel官网
中文文档1、中文文档2
实验楼论坛
Laravel中文网问答社区
PHPHub中文社区
API文档
laravel.io
LARACASTS
代码下载:
$ git clone https://github.com/shiyanlou/laravel-blog-1.git
下载文档
热门试卷
- 2016年四川省内江市中考化学试卷
- 广西钦州市高新区2017届高三11月月考政治试卷
- 浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
- 浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
- 辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
- 广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
- 广西钦州市钦州港区2017届高三11月月考政治试卷
- 广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
- 广西钦州市高新区2016-2017学年高二11月月考政治试卷
- 广西钦州市高新区2016-2017学年高一11月月考政治试卷
- 山东省滨州市三校2017届第一学期阶段测试初三英语试题
- 四川省成都七中2017届高三一诊模拟考试文科综合试卷
- 2017届普通高等学校招生全国统一考试模拟试题(附答案)
- 重庆市永川中学高2017级上期12月月考语文试题
- 江西宜春三中2017届高三第一学期第二次月考文科综合试题
- 内蒙古赤峰二中2017届高三上学期第三次月考英语试题
- 2017年六年级(上)数学期末考试卷
- 2017人教版小学英语三年级上期末笔试题
- 江苏省常州西藏民族中学2016-2017学年九年级思想品德第一学期第二次阶段测试试卷
- 重庆市九龙坡区七校2016-2017学年上期八年级素质测查(二)语文学科试题卷
- 江苏省无锡市钱桥中学2016年12月八年级语文阶段性测试卷
- 江苏省无锡市钱桥中学2016-2017学年七年级英语12月阶段检测试卷
- 山东省邹城市第八中学2016-2017学年八年级12月物理第4章试题(无答案)
- 【人教版】河北省2015-2016学年度九年级上期末语文试题卷(附答案)
- 四川省简阳市阳安中学2016年12月高二月考英语试卷
- 四川省成都龙泉中学高三上学期2016年12月月考试题文科综合能力测试
- 安徽省滁州中学2016—2017学年度第一学期12月月考高三英语试卷
- 山东省武城县第二中学2016.12高一年级上学期第二次月考历史试题(必修一第四、五单元)
- 福建省四地六校联考2016-2017学年上学期第三次月考高三化学试卷
- 甘肃省武威第二十三中学2016—2017学年度八年级第一学期12月月考生物试卷
网友关注
- 个人理财实例分析
- 零基础学外汇:三蜡烛线形态
- 零基础学外汇:总结日本蜡烛线
- 证券公司实习总结
- 通过泡妞手段,便能看出你的投资水平
- 【现货黄金投资】涨11美元两连阳创三周收盘高位,美元下跌支撑
- 【现货黄金投资】黄昏之星乍现,油价弱于金银将继续上演
- 证券市场基础知识练习五
- 红象金融
- GWFX金道环球策略分析:欧元短线突破很迅速
- GWFX金道环球热点:迈向SDR
- 在西欧寻求“一带一路”突破口
- 中信银行2015实习大礼包
- 山轻工财务与金融学院营销策划计划[资料]
- 金融学0-5【精品】
- 经济师考试中级金融专业高频考点:金融监管国际协调背景方式
- 基本面和技术面的较量_鼎丰银
- 中国十年后哪些资产会暴跌或暴涨?
- 肖申克救赎里的投资之道
- 【环球外汇网】:LMCI诱发美元空头止损 澳元待降息谜底宣判
- 经济师考试中级金融专业高频考点:金融监管与货币政策的相互协调
- 说金论赢:美联储加息遥无期 美指日线惊现五连阴
- 【环球外汇网】:LMCI联手非农唱双簧 黄金1220关口待爆发
- Order Approving a Proposed Rule Change Relating to Stock-:为了批准拟议的规则变化有关的股票—
- 【现货黄金投资】一旦美联储暗示推迟加息,黄金价格将有望继续上涨
- 史丹利化肥股份有限公司限制性股票激励计划(草案修订稿)摘要-上海证券报
- 互联网金融背景下的商业银行网点转型策略
- 家庭理财与风险保障(授课版)
- 【现货黄金投资】跳涨28美元站稳1200关口,FED加息前景和希腊疑虑支撑
- 房地产私募基金操作流程与管控
网友关注视频
- 【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省
- 北师大版八年级物理下册 第六章 常见的光学仪器(二)探究凸透镜成像的规律
- 第五单元 民族艺术的瑰宝_16. 形形色色的民族乐器_第一课时(岭南版六年级上册)_T1406126
- 沪教版牛津小学英语(深圳用) 五年级下册 Unit 7
- 3.2 数学二年级下册第二单元 表内除法(一)整理和复习 李菲菲
- 【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,湖北省
- 第五单元 民族艺术的瑰宝_16. 形形色色的民族乐器_第一课时(岭南版六年级上册)_T3751175
- 外研版英语三起5年级下册(14版)Module3 Unit1
- 外研版英语七年级下册module1unit3名词性物主代词讲解
- 化学九年级下册全册同步 人教版 第25集 生活中常见的盐(二)
- 19 爱护鸟类_第一课时(二等奖)(桂美版二年级下册)_T3763925
- 外研版英语三起5年级下册(14版)Module3 Unit2
- 外研版英语七年级下册module3 unit2第一课时
- 沪教版牛津小学英语(深圳用) 四年级下册 Unit 12
- 二年级下册数学第二课
- 《空中课堂》二年级下册 数学第一单元第1课时
- 人教版二年级下册数学
- 冀教版小学数学二年级下册第二周第2课时《我们的测量》宝丰街小学庞志荣
- 北师大版数学 四年级下册 第三单元 第二节 小数点搬家
- 第五单元 民族艺术的瑰宝_15. 多姿多彩的民族服饰_第二课时(市一等奖)(岭南版六年级上册)_T129830
- 【部编】人教版语文七年级下册《逢入京使》优质课教学视频+PPT课件+教案,安徽省
- 【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,辽宁省
- 青岛版教材五年级下册第四单元(走进军营——方向与位置)用数对确定位置(一等奖)
- 精品·同步课程 历史 八年级 上册 第15集 近代科学技术与思想文化
- 外研版英语七年级下册module3 unit1第二课时
- 河南省名校课堂七年级下册英语第一课(2020年2月10日)
- 二年级下册数学第一课
- 北师大版数学四年级下册第三单元第四节街心广场
- 冀教版小学英语四年级下册Lesson2授课视频
- 沪教版牛津小学英语(深圳用) 四年级下册 Unit 8
精品推荐
- 2016-2017学年高一语文人教版必修一+模块学业水平检测试题(含答案)
- 广西钦州市高新区2017届高三11月月考政治试卷
- 浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
- 浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
- 辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
- 广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
- 广西钦州市钦州港区2017届高三11月月考政治试卷
- 广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
- 广西钦州市高新区2016-2017学年高二11月月考政治试卷
- 广西钦州市高新区2016-2017学年高一11月月考政治试卷
分类导航
- 互联网
- 电脑基础知识
- 计算机软件及应用
- 计算机硬件及网络
- 计算机应用/办公自动化
- .NET
- 数据结构与算法
- Java
- SEO
- C/C++资料
- linux/Unix相关
- 手机开发
- UML理论/建模
- 并行计算/云计算
- 嵌入式开发
- windows相关
- 软件工程
- 管理信息系统
- 开发文档
- 图形图像
- 网络与通信
- 网络信息安全
- 电子支付
- Labview
- matlab
- 网络资源
- Python
- Delphi/Perl
- 评测
- Flash/Flex
- CSS/Script
- 计算机原理
- PHP资料
- 数据挖掘与模式识别
- Web服务
- 数据库
- Visual Basic
- 电子商务
- 服务器
- 搜索引擎优化
- 存储
- 架构
- 行业软件
- 人工智能
- 计算机辅助设计
- 多媒体
- 软件测试
- 计算机硬件与维护
- 网站策划/UE
- 网页设计/UI
- 网吧管理