SlideShare a Scribd company logo
Laravel 로 배우는 서버사이드 #5
게시판 만들어보기
ABCD, SNOWKIWI / 한성일
1. 어플리케이션 구조
게시판
HTML 파일들
파일 구조
- add.blade.php
- edit.blade.php
- list.blade.php
- login.blade.php
- view.blade.php
- default.blade.php
resources/views/board/contents/
resources/views/board/layout/
public/css/
- abcd.css
- BoardContents.php
- BoardUser.php
app/
- BoardController.php
app/Http/Controllers/
2. VIEW 설정
부트스트랩
http://getbootstrap.com/
CSS 등록
public/css/abcd.css
css 폴더를 만들고 abcd.css 생성
/* Common */
.vertical-align {
display: flex;
align-items: center;
flex-direction: row;
}
.content {
position: relative;
padding: 15px;
margin: 0 -15px 15px;
border-color: #e5e5e5 #eee #eee;
border-style: solid;
border-width: 1px 1px;
-webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05);
box-shadow: none;
}
/* Login Form */
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
View 구조
- add.blade.php
- edit.blade.php
- list.blade.php
- login.blade.php
- view.blade.php
- default.blade.php
resources/views/board/contents/
resources/views/board/layout/
Default Layout
resources/views/board/layout/default.blade.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> @yield('title') </title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="css/abcd.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body class="container">
@yield('content')
</body>
</html>
등록 컨텐츠
resources/views/board/contents/add.blade.php
@extends('board.layout.default')
@section('title')
등록
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<form action="/add" id="addForm" method="post" >
<div class="form-group">
<input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." required autofocus>
</div>
<div class="form-group">
<textarea name="contents" class="form-control" rows="5" required></textarea>
</div>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="vertical-align">
<div class="col-md-11 text-right">
<button class="btn btn-primary" type="submit">등록</button>
</div>
<div class="col-md-1 text-left ">
<button class="btn btn-default" id="listBtn" type="button">
목록
</button>
</div>
</div>
</form>
<script>
$(document).ready(function(){
$("#listBtn").click(function(){
location.href = "/list";
});
});
</script>
@stop
수정 컨텐츠
resources/views/board/contents/edit.blade.php
@extends('board.layout.default')
@section('title')
수정
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<form action="/edit" id="editForm" method="post" >
<div class="form-group">
<input type="text" name="title" class="form-control"
placeholder="제목을 입력하세요." value="{{$contents->title}}" required autofocus>
</div>
<div class="form-group">
<textarea name="contents" class="form-control" rows=“5" required>{{$contents->contents}}</textarea>
</div>
<input type="hidden" name="pageid" value="{{ $pageid }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="vertical-align">
<div class="col-md-11 text-right">
<button class="btn btn-primary" type="submit">수정</button>
</div>
<div class="col-md-1 text-left ">
<button class="btn btn-default" id="listBtn" type="button">
목록
</button>
</div>
</div>
</form>
<script>
$(document).ready(function(){
$("#listBtn").click(function(){
location.href = "/list";
});
});
</script>
@stop
소스 설명
@extends('board.layout.default')
@section('title')
수정
@stop
@section(‘content')
~
@stop
default.blade.php 에 지정된 영역
<input type="hidden" name="_token" value="{{ csrf_token() }}">
POST 전달에 사용되는 토큰 Post form 에 히든으로 위치
없으면 서버전송시 에러 발생
목록 컨텐츠 1
resources/views/board/contents/list.blade.php
@extends('board.layout.default')
@section('title')
목록
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<div class="panel panel-default">
<!-- Table -->
<table class="table">
<thead>
<tr>
<th class="col-md-1">#</th>
<th class="col-md-6">제목</th>
<th class="col-md-2">작성자</th>
<th class="col-md-2">작성일</th>
<th class="col-md-1">조회수</th>
</tr>
</thead>
<tbody>
@foreach ($contents as $item)
<tr>
<th scope="row">{{ $item->id }}</th>
<td><a href="/view?pageid={{ $item->id }}">{{ $item->title }}</a></td>
<td>{{ $item->reg_user_name }}</td>
<td>{{ $item->created_at }}</td>
<td>{{ $item->view_count }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
목록 컨텐츠 2<div class="vertical-align">
<div class="col-md-8">
<?php echo $contents->render(); ?>
</div>
<div class="col-md-3 text-right ">
@if (Session::has('login'))
<button type="button" id="addFormBtn" class="btn btn-default btn-primary">등록</button>
@endif
</div>
<div class="col-md-1 btn-group text-right">
@if (Session::has('login'))
<button class="btn btn-default" id="logoutBtn" type="button">
로그아웃
</button>
@else
<button class="btn btn-default" id="loginFormBtn" type="button">
로그인
</button>
@endif
</div>
</div>
<script>
$(document).ready(function(){
$("#addFormBtn").click(function(){
location.href = "/add-form";
});
$("#loginFormBtn").click(function(){
location.href = "/login-form";
});
$("#logoutBtn").click(function(){
location.href = "/logout";
});
});
</script>
@stop
소스설명
@if (Session::has(‘login'))
// 실행될 문장
@endif
세션이 있을때만 실행
<?php echo $contents->render(); ?>
페이지네이션 생성
로그인 컨텐츠
resources/views/board/contents/login.blade.php
@extends('board.layout.default')
@section('title')
로그인
@stop
@section('content')
<div>
<form class="form-signin" action="login" method="post">
<h2>ABCD 로그인</h2>
<input type="email" name="email" class="form-control"
placeholder="이메일" required autofocus>
<input type="password" name="password" class="form-control"
placeholder="비밀번호" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">로그인</button>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
</div>
@stop
게시물 보기 컨텐츠 1
resources/views/board/contents/view.blade.php
@extends('board.layout.default')
@section('title')
{{$contents->title}}
@stop
@section('content')
<div class="page-header">
<h1>ABCD <small>ABout CoDing</small></h1>
</div>
<div class="row vertical-align">
<div class="col-md-8">
<h4>{{$contents->title}}</h4>
</div>
<div class="col-md-4 text-right">
<p>작성자 : {{$contents->reg_user_name}} 작성일 : {{$contents->created_at}}</p>
</div>
</div>
<div class="content">
{{$contents->contents}}
</div>
<div class="vertical-align">
<div class="col-md-8"></div>
<div class="col-md-3 text-right ">
<div class="btn-group" role="group">
@if (Session::has('login'))
<button type="button" id="editFormBtn" class="btn btn-default">수정</button>
<button type="button" id="delBtn" class="btn btn-default">삭제</button>
@endif
<button type="button" id="listBtn" class="btn btn-default">목록</button>
</div>
</div>
게시물 보기 컨텐츠 1
<div class="col-md-1 btn-group text-right">
@if (Session::has('login'))
<button class="btn btn-default" id="logoutBtn" type="button">
로그아웃
</button>
@else
<button class="btn btn-default" id="loginFormBtn" type="button">
로그인
</button>
@endif
</div>
</div>
<script>
$(document).ready(function(){
$("#editFormBtn").click(function(){
location.href = "/edit-form?pageid={{$pageid}}";
});
$("#delBtn").click(function(){
location.href = "/delete?pageid={{$pageid}}";
});
$("#listBtn").click(function(){
location.href = "/list";
});
$("#loginFormBtn").click(function(){
location.href = "/login-form";
});
$("#logoutBtn").click(function(){
location.href = "/logout";
});
});
</script>
@stop
3. DB설정
acbd 커넥션에 연결
#4 참조
USE abcd_db;
기본 스키마 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(45) NULL,
password VARCHAR(45) NULL,
name VARCHAR(45) NULL,
PRIMARY KEY (id))
ENGINE = InnoDB;
CREATE TABLE contents (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(45) NULL,
contents TEXT NULL,
reg_user_id INT NOT NULL,
reg_user_name VARCHAR(45) NULL,
view_count INT NULL DEFAULT 0,
updated_at TIMESTAMP NULL,
created_at TIMESTAMP NULL,
PRIMARY KEY (id),
INDEX fk_contents_users_idx (reg_user_id ASC),
CONSTRAINT fk_contents_users
FOREIGN KEY (reg_user_id)
REFERENCES abcd_db.users (id)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
회원 정보 입력
insert into
users (email, password, name)
values ( 'test@test.com', password('1234'), 'test user');
insert into
users (email, password, name)
values ( ‘jamie@snowkiwi.com’, password('1234'), ‘Jamie Han');
기본 회원 생성확인
SELECT * FROM users;
4. Model 설정
모델 생성
콘솔 홈 디렉토리로 이동1
cd ~/Documents/laravel-space/abcd
cd C:laravel-spaceabcd
2
php artisan make:model BoardUser
php artisan make:model BoardContents
app/BoardContents.php
app/BoardUser.php3 파일 생성 확인
BoardUser 모델
app/BoardUser.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class BoardUser extends Model
{
protected $table = 'users';
protected $fillable = ['id', 'email', 'password', 'name'];
protected $hidden = ['password'];
}
BoardContents 모델
app/BoardContents.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class BoardContents extends Model
{
protected $table = 'contents';
protected $fillable = ['id', 'title', 'reg_user_id',
'reg_user_name', 'view_count', 'updated_at', 'created_at' ];
protected $hidden = [];
}
5. Route 설정
routes.php
/* Board */
Route::get('/login-form', 'BoardController@loginForm');
Route::post('/login', 'BoardController@login');
Route::get('/logout', 'BoardController@logout');
Route::get('/add-form', 'BoardController@addForm');
Route::post('/add', 'BoardController@add');
Route::get('/edit-form', 'BoardController@editForm');
Route::post('/edit', 'BoardController@edit');
Route::get('/delete', 'BoardController@delete');
Route::get('/list', 'BoardController@listView');
Route::get('/view', 'BoardController@view');
app/Http/routes.php
6. 컨트롤러 설정
컨트롤러 생성
콘솔 홈 디렉토리로 이동1
cd ~/Documents/laravel-space/abcd
cd C:laravel-spaceabcd
2
3
파일 생성 확인
php artisan make:controller BoardController
app/Http/Controllers/BoardController.php
코딩 위치
app/Http/Controllers/BoardController.php
class BoardController extends Controller
{
기본 생성 함수 삭제후 코딩
}
use AppBoardContents;
use AppBoardUser;
다음라인 추가
로그인
public function loginForm() {
return view('board.contents.login');
}
public function login(Request $request) {
$email = $request->input('email');
$password = $request->input('password');
$user = BoardUser::whereRaw('email = ? and password = password(?)', [$email,
$password] );
if ( $user->count() > 0 ) { // 로그인 성공
$request->session()->put('login', true);
$request->session()->put('user_id', $user->get()[0]->id);
$request->session()->put('user_name', $user->get()[0]->name);
return redirect('/list');
} else { // 로그인 실패
return redirect('/login-form');
}
}
로그인 실행
http://localhost/login-form
게시물 등록
public function addForm() {
return view('board.contents.add');
}
public function add(Request $request) {
$title = $request->input('title');
$contents = $request->input('contents');
$boardContents = new BoardContents();
$boardContents->title = $title;
$boardContents->contents = $contents;
$boardContents->reg_user_id = $request->session()->get('user_id');
$boardContents->reg_user_name = $request->session()->get('user_name');
$boardContents->save();
return redirect('/list');
}
게시물 등록
http://localhost/add-form
게시물 목록
public function listView() {
// 페이지네이션 사용
$contents = BoardContents::orderBy('id', 'desc')->paginate(5);
$contents->setPath('/list');
return view('board.contents.list')->with('contents', $contents);
}
게시물 목록
/add
http://localhost/list
게시물 수정
public function editForm(Request $request) {
$pageid = $request->input('pageid');
$boardContents = BoardContents::find($pageid);
return view('board.contents.edit')->with('contents', $boardContents)
->with('pageid', $pageid);
}
public function edit(Request $request) {
$pageid = $request->input('pageid');
$title = $request->input('title');
$contents = $request->input('contents');
$boardContents = BoardContents::find($pageid);
$boardContents->title = $title;
$boardContents->contents = $contents;
$boardContents->save();
return redirect('/view?pageid='.$pageid);
}
게시물 수정
http://localhost/list
게시물 삭제
public function delete(Request $request) {
$pageid = $request->input('pageid');
$boardContents = BoardContents::whereRaw('id = ?', [$pageid]);
$boardContents->delete();
return redirect('/list');
}
게시물 삭제
http://localhost/list
로그아웃
public function logout(Request $request) {
$request->session()->flush();
return redirect('/list');
}
로그아웃 실행
http://localhost/list
게시물 보기
public function view(Request $request) {
$pageid = $request->input('pageid');
BoardContents::whereRaw('id = ?', [$pageid])->increment('view_count');
$contents = BoardContents::find($pageid);
return view(‘board.contents.view')->
with('contents', $contents)->with('pageid', $pageid);
}
게시물 보기 실행
http://localhost/view
View
http://localhost/login-form
http://localhost/add-form http://localhost/edit-form
/add
http://localhost/list
http://localhost/view
게시판 소스는 꼭 한번 해보시고 수정해보세요.
그러면 라라벨 웹개발 프로세스를 이해하시는데
큰도움이 될거라 생각합니다.
이번 과정이 모두 끝났습니다.
그동안 정말 수고하셨습니다. :)
궁금하신 부분은 슬렉으로 문의 주세요.
http://abcds.kr/wp-login.php?action=slack-invitation
https://abcds.slack.com
정말!! 수고하셨습니다. :)
http://abcds.kr/

More Related Content

What's hot (20)

PDF
AnkaraJUG Kasım 2012 - PrimeFaces
Ankara JUG
 
KEY
CodeIgniter 3.0
Phil Sturgeon
 
PDF
Frameworks da nova Era PHP FuelPHP
Dan Jesus
 
PPT
Symfony2 and AngularJS
Antonio Peric-Mazar
 
PDF
Rails 3 overview
Yehuda Katz
 
PDF
YUI on the go
Christian Heilmann
 
DOC
Creating a Simple PHP and MySQL-Based Login System
Azharul Haque Shohan
 
PDF
Action View Form Helpers - 1, Season 2
RORLAB
 
PDF
Backbone - TDC 2011 Floripa
Rafael Felix da Silva
 
PDF
&lt;img src="../i/r_14.png" />
tutorialsruby
 
PDF
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
성일 한
 
KEY
Sprout core and performance
Yehuda Katz
 
PDF
Web2py tutorial to create db driven application.
fRui Apps
 
PDF
Mojolicious
Marcos Rebelo
 
PDF
Mashing up JavaScript
Bastian Hofmann
 
PDF
Web2py Code Lab
Colin Su
 
TXT
https://www.facebook.com/valdyna.monna?fref=ts
Arif Alexi
 
PDF
FamilySearch Reference Client
Dallan Quass
 
PDF
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
PDF
ActiveResource & REST
Robbert
 
AnkaraJUG Kasım 2012 - PrimeFaces
Ankara JUG
 
CodeIgniter 3.0
Phil Sturgeon
 
Frameworks da nova Era PHP FuelPHP
Dan Jesus
 
Symfony2 and AngularJS
Antonio Peric-Mazar
 
Rails 3 overview
Yehuda Katz
 
YUI on the go
Christian Heilmann
 
Creating a Simple PHP and MySQL-Based Login System
Azharul Haque Shohan
 
Action View Form Helpers - 1, Season 2
RORLAB
 
Backbone - TDC 2011 Floripa
Rafael Felix da Silva
 
&lt;img src="../i/r_14.png" />
tutorialsruby
 
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
성일 한
 
Sprout core and performance
Yehuda Katz
 
Web2py tutorial to create db driven application.
fRui Apps
 
Mojolicious
Marcos Rebelo
 
Mashing up JavaScript
Bastian Hofmann
 
Web2py Code Lab
Colin Su
 
https://www.facebook.com/valdyna.monna?fref=ts
Arif Alexi
 
FamilySearch Reference Client
Dallan Quass
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
ActiveResource & REST
Robbert
 

Viewers also liked (20)

PDF
Laravel 로 배우는 서버사이드 #4
성일 한
 
PDF
Laravel 로 배우는 서버사이드 #1
성일 한
 
PDF
Laravel 로 배우는 서버사이드 #2
성일 한
 
PDF
Laravel 로 배우는 서버사이드 #3
성일 한
 
PDF
Python 으로 Slackbot 개발하기
성일 한
 
PPTX
2016 ABCD 소개
성일 한
 
PDF
Ionic으로 모바일앱 만들기 #3
성일 한
 
PDF
Ionic으로 모바일앱 만들기 #5
성일 한
 
PDF
Ionic으로 모바일앱 만들기 #2
성일 한
 
PDF
Ionic으로 모바일앱 만들기 #1
성일 한
 
PDF
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
양재동 코드랩
 
PDF
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
양재동 코드랩
 
PDF
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
양재동 코드랩
 
PDF
2016 W3C Conference #2 : VANILA JS로 개발하기
양재동 코드랩
 
PDF
2016 W3C Conference #4 : ANGULAR + ES6
양재동 코드랩
 
PDF
2016 W3C Conference #1 : 웹 개발의 현재와 미래
양재동 코드랩
 
PDF
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
양재동 코드랩
 
PPTX
Data-binding AngularJS
EunYoung Kim
 
PDF
가볍게 살펴보는 AngularJS
Jae Sung Park
 
PDF
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
Laravel 로 배우는 서버사이드 #4
성일 한
 
Laravel 로 배우는 서버사이드 #1
성일 한
 
Laravel 로 배우는 서버사이드 #2
성일 한
 
Laravel 로 배우는 서버사이드 #3
성일 한
 
Python 으로 Slackbot 개발하기
성일 한
 
2016 ABCD 소개
성일 한
 
Ionic으로 모바일앱 만들기 #3
성일 한
 
Ionic으로 모바일앱 만들기 #5
성일 한
 
Ionic으로 모바일앱 만들기 #2
성일 한
 
Ionic으로 모바일앱 만들기 #1
성일 한
 
2016 W3C Conference #5 : UNIVERSAL RENDERING (React.JS 중심)
양재동 코드랩
 
2016 W3C Conference #7 : Electron, 웹 기술로 담아내는 데스크톱 애플리케이션
양재동 코드랩
 
2016 W3C Conference #6 : ReactiveX + Meteor 종단간 암호화 구현 사례
양재동 코드랩
 
2016 W3C Conference #2 : VANILA JS로 개발하기
양재동 코드랩
 
2016 W3C Conference #4 : ANGULAR + ES6
양재동 코드랩
 
2016 W3C Conference #1 : 웹 개발의 현재와 미래
양재동 코드랩
 
2016 W3C Conference #9 : 컨테이너와 웹 어플리케이션
양재동 코드랩
 
Data-binding AngularJS
EunYoung Kim
 
가볍게 살펴보는 AngularJS
Jae Sung Park
 
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
Ad

Similar to Laravel 로 배우는 서버사이드 #5 (20)

PDF
Practical PHP by example Jan Leth-Kjaer
COMMON Europe
 
PPT
PHP POWERPOINT SLIDES
Ismail Mukiibi
 
PPTX
Implementation of GUI Framework part3
masahiroookubo
 
PPT
Clever Joomla! Templating Tips and Tricks
ThemePartner
 
PPT
Framework
Nguyen Linh
 
PDF
Vaadin Components @ Angular U
Joonas Lehtinen
 
DOC
Ex[1].3 php db connectivity
Mouli Chandira
 
PDF
Blog Hacks 2011
Yusuke Wada
 
PPTX
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
crokitta
 
PDF
Enjoy the vue.js
TechExeter
 
PDF
Building iPhone Web Apps using "classic" Domino
Rob Bontekoe
 
PDF
Desenvolvimento web com Ruby on Rails (parte 2)
Joao Lucas Santana
 
PPTX
HTML5
Brandon Byars
 
TXT
Pp checker
Randy Arios
 
PPTX
HTML5 - Pedro Rosa
Comunidade NetPonto
 
DOCX
Kohana bootstrap - modal form
Julio Pari
 
PDF
Kohana bootstrap - modal form
Julio Pari
 
PDF
Rails 3: Dashing to the Finish
Yehuda Katz
 
PDF
HTML5 New and Improved
Timothy Fisher
 
PDF
Your Custom WordPress Admin Pages Suck
Anthony Montalbano
 
Practical PHP by example Jan Leth-Kjaer
COMMON Europe
 
PHP POWERPOINT SLIDES
Ismail Mukiibi
 
Implementation of GUI Framework part3
masahiroookubo
 
Clever Joomla! Templating Tips and Tricks
ThemePartner
 
Framework
Nguyen Linh
 
Vaadin Components @ Angular U
Joonas Lehtinen
 
Ex[1].3 php db connectivity
Mouli Chandira
 
Blog Hacks 2011
Yusuke Wada
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
crokitta
 
Enjoy the vue.js
TechExeter
 
Building iPhone Web Apps using "classic" Domino
Rob Bontekoe
 
Desenvolvimento web com Ruby on Rails (parte 2)
Joao Lucas Santana
 
Pp checker
Randy Arios
 
HTML5 - Pedro Rosa
Comunidade NetPonto
 
Kohana bootstrap - modal form
Julio Pari
 
Kohana bootstrap - modal form
Julio Pari
 
Rails 3: Dashing to the Finish
Yehuda Katz
 
HTML5 New and Improved
Timothy Fisher
 
Your Custom WordPress Admin Pages Suck
Anthony Montalbano
 
Ad

More from 성일 한 (15)

PDF
Ionic으로 모바일앱 만들기 #4
성일 한
 
PDF
파이어베이스 스터디
성일 한
 
PDF
Vuejs 시작하기
성일 한
 
PDF
Electron 개발하기
성일 한
 
PDF
챗봇 시작해보기
성일 한
 
PDF
인플루언서 마케팅 (INFLUENCER MARKETING)
성일 한
 
PDF
처음배우는 자바스크립트, 제이쿼리 #3
성일 한
 
PDF
처음배우는 자바스크립트, 제이쿼리 #2
성일 한
 
PDF
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
 
PDF
CSS 선택자와 디버그
성일 한
 
PDF
워드프레스 기초 (ABCD) #2
성일 한
 
PDF
워드프레스 기초 (ABCD) #1
성일 한
 
PDF
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
성일 한
 
PDF
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
성일 한
 
PDF
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
성일 한
 
Ionic으로 모바일앱 만들기 #4
성일 한
 
파이어베이스 스터디
성일 한
 
Vuejs 시작하기
성일 한
 
Electron 개발하기
성일 한
 
챗봇 시작해보기
성일 한
 
인플루언서 마케팅 (INFLUENCER MARKETING)
성일 한
 
처음배우는 자바스크립트, 제이쿼리 #3
성일 한
 
처음배우는 자바스크립트, 제이쿼리 #2
성일 한
 
처음배우는 자바스크립트, 제이쿼리 #1
성일 한
 
CSS 선택자와 디버그
성일 한
 
워드프레스 기초 (ABCD) #2
성일 한
 
워드프레스 기초 (ABCD) #1
성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #3 (ABCD)
성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #2 (ABCD)
성일 한
 
파이썬 플라스크로 배우는 웹프로그래밍 #1 (ABCD Foundation)
성일 한
 

Recently uploaded (20)

PDF
Supabase Meetup: Build in a weekend, scale to millions
Carlo Gilmar Padilla Santana
 
PDF
New Download FL Studio Crack Full Version [Latest 2025]
imang66g
 
PDF
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
PDF
Using licensed Data Loss Prevention (DLP) as a strategic proactive data secur...
Q-Advise
 
PPT
Why Reliable Server Maintenance Service in New York is Crucial for Your Business
Sam Vohra
 
PPTX
Farrell__10e_ch04_PowerPoint.pptx Programming Logic and Design slides
bashnahara11
 
PPTX
Role Of Python In Programing Language.pptx
jaykoshti048
 
PPTX
classification of computer and basic part of digital computer
ravisinghrajpurohit3
 
PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
PDF
How Agentic AI Networks are Revolutionizing Collaborative AI Ecosystems in 2025
ronakdubey419
 
PDF
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
PDF
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
PDF
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
PPTX
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
PDF
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
PDF
Infrastructure planning and resilience - Keith Hastings.pptx.pdf
Safe Software
 
PDF
Summary Of Odoo 18.1 to 18.4 : The Way For Odoo 19
CandidRoot Solutions Private Limited
 
PDF
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
PDF
Troubleshooting Virtual Threads in Java!
Tier1 app
 
PPT
Activate_Methodology_Summary presentatio
annapureddyn
 
Supabase Meetup: Build in a weekend, scale to millions
Carlo Gilmar Padilla Santana
 
New Download FL Studio Crack Full Version [Latest 2025]
imang66g
 
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
Using licensed Data Loss Prevention (DLP) as a strategic proactive data secur...
Q-Advise
 
Why Reliable Server Maintenance Service in New York is Crucial for Your Business
Sam Vohra
 
Farrell__10e_ch04_PowerPoint.pptx Programming Logic and Design slides
bashnahara11
 
Role Of Python In Programing Language.pptx
jaykoshti048
 
classification of computer and basic part of digital computer
ravisinghrajpurohit3
 
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
How Agentic AI Networks are Revolutionizing Collaborative AI Ecosystems in 2025
ronakdubey419
 
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
New Download MiniTool Partition Wizard Crack Latest Version 2025
imang66g
 
TRAVEL APIs | WHITE LABEL TRAVEL API | TOP TRAVEL APIs
philipnathen82
 
Enhancing Healthcare RPM Platforms with Contextual AI Integration
Cadabra Studio
 
Infrastructure planning and resilience - Keith Hastings.pptx.pdf
Safe Software
 
Summary Of Odoo 18.1 to 18.4 : The Way For Odoo 19
CandidRoot Solutions Private Limited
 
SAP GUI Installation Guide for macOS (iOS) | Connect to SAP Systems on Mac
SAP Vista, an A L T Z E N Company
 
Troubleshooting Virtual Threads in Java!
Tier1 app
 
Activate_Methodology_Summary presentatio
annapureddyn
 

Laravel 로 배우는 서버사이드 #5

  • 1. Laravel 로 배우는 서버사이드 #5 게시판 만들어보기 ABCD, SNOWKIWI / 한성일
  • 5. 파일 구조 - add.blade.php - edit.blade.php - list.blade.php - login.blade.php - view.blade.php - default.blade.php resources/views/board/contents/ resources/views/board/layout/ public/css/ - abcd.css - BoardContents.php - BoardUser.php app/ - BoardController.php app/Http/Controllers/
  • 8. CSS 등록 public/css/abcd.css css 폴더를 만들고 abcd.css 생성 /* Common */ .vertical-align { display: flex; align-items: center; flex-direction: row; } .content { position: relative; padding: 15px; margin: 0 -15px 15px; border-color: #e5e5e5 #eee #eee; border-style: solid; border-width: 1px 1px; -webkit-box-shadow: inset 0 3px 6px rgba(0,0,0,.05); box-shadow: none; } /* Login Form */ .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin input[type="email"] { margin-bottom: -1px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; }
  • 9. View 구조 - add.blade.php - edit.blade.php - list.blade.php - login.blade.php - view.blade.php - default.blade.php resources/views/board/contents/ resources/views/board/layout/
  • 10. Default Layout resources/views/board/layout/default.blade.php <!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> @yield('title') </title> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> <link href="css/abcd.css" rel="stylesheet"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> </head> <body class="container"> @yield('content') </body> </html>
  • 11. 등록 컨텐츠 resources/views/board/contents/add.blade.php @extends('board.layout.default') @section('title') 등록 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <form action="/add" id="addForm" method="post" > <div class="form-group"> <input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." required autofocus> </div> <div class="form-group"> <textarea name="contents" class="form-control" rows="5" required></textarea> </div> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="vertical-align"> <div class="col-md-11 text-right"> <button class="btn btn-primary" type="submit">등록</button> </div> <div class="col-md-1 text-left "> <button class="btn btn-default" id="listBtn" type="button"> 목록 </button> </div> </div> </form> <script> $(document).ready(function(){ $("#listBtn").click(function(){ location.href = "/list"; }); }); </script> @stop
  • 12. 수정 컨텐츠 resources/views/board/contents/edit.blade.php @extends('board.layout.default') @section('title') 수정 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <form action="/edit" id="editForm" method="post" > <div class="form-group"> <input type="text" name="title" class="form-control" placeholder="제목을 입력하세요." value="{{$contents->title}}" required autofocus> </div> <div class="form-group"> <textarea name="contents" class="form-control" rows=“5" required>{{$contents->contents}}</textarea> </div> <input type="hidden" name="pageid" value="{{ $pageid }}"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="vertical-align"> <div class="col-md-11 text-right"> <button class="btn btn-primary" type="submit">수정</button> </div> <div class="col-md-1 text-left "> <button class="btn btn-default" id="listBtn" type="button"> 목록 </button> </div> </div> </form> <script> $(document).ready(function(){ $("#listBtn").click(function(){ location.href = "/list"; }); }); </script> @stop
  • 13. 소스 설명 @extends('board.layout.default') @section('title') 수정 @stop @section(‘content') ~ @stop default.blade.php 에 지정된 영역 <input type="hidden" name="_token" value="{{ csrf_token() }}"> POST 전달에 사용되는 토큰 Post form 에 히든으로 위치 없으면 서버전송시 에러 발생
  • 14. 목록 컨텐츠 1 resources/views/board/contents/list.blade.php @extends('board.layout.default') @section('title') 목록 @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <div class="panel panel-default"> <!-- Table --> <table class="table"> <thead> <tr> <th class="col-md-1">#</th> <th class="col-md-6">제목</th> <th class="col-md-2">작성자</th> <th class="col-md-2">작성일</th> <th class="col-md-1">조회수</th> </tr> </thead> <tbody> @foreach ($contents as $item) <tr> <th scope="row">{{ $item->id }}</th> <td><a href="/view?pageid={{ $item->id }}">{{ $item->title }}</a></td> <td>{{ $item->reg_user_name }}</td> <td>{{ $item->created_at }}</td> <td>{{ $item->view_count }}</td> </tr> @endforeach </tbody> </table> </div>
  • 15. 목록 컨텐츠 2<div class="vertical-align"> <div class="col-md-8"> <?php echo $contents->render(); ?> </div> <div class="col-md-3 text-right "> @if (Session::has('login')) <button type="button" id="addFormBtn" class="btn btn-default btn-primary">등록</button> @endif </div> <div class="col-md-1 btn-group text-right"> @if (Session::has('login')) <button class="btn btn-default" id="logoutBtn" type="button"> 로그아웃 </button> @else <button class="btn btn-default" id="loginFormBtn" type="button"> 로그인 </button> @endif </div> </div> <script> $(document).ready(function(){ $("#addFormBtn").click(function(){ location.href = "/add-form"; }); $("#loginFormBtn").click(function(){ location.href = "/login-form"; }); $("#logoutBtn").click(function(){ location.href = "/logout"; }); }); </script> @stop
  • 16. 소스설명 @if (Session::has(‘login')) // 실행될 문장 @endif 세션이 있을때만 실행 <?php echo $contents->render(); ?> 페이지네이션 생성
  • 17. 로그인 컨텐츠 resources/views/board/contents/login.blade.php @extends('board.layout.default') @section('title') 로그인 @stop @section('content') <div> <form class="form-signin" action="login" method="post"> <h2>ABCD 로그인</h2> <input type="email" name="email" class="form-control" placeholder="이메일" required autofocus> <input type="password" name="password" class="form-control" placeholder="비밀번호" required> <button class="btn btn-lg btn-primary btn-block" type="submit">로그인</button> <input type="hidden" name="_token" value="{{ csrf_token() }}"> </form> </div> @stop
  • 18. 게시물 보기 컨텐츠 1 resources/views/board/contents/view.blade.php @extends('board.layout.default') @section('title') {{$contents->title}} @stop @section('content') <div class="page-header"> <h1>ABCD <small>ABout CoDing</small></h1> </div> <div class="row vertical-align"> <div class="col-md-8"> <h4>{{$contents->title}}</h4> </div> <div class="col-md-4 text-right"> <p>작성자 : {{$contents->reg_user_name}} 작성일 : {{$contents->created_at}}</p> </div> </div> <div class="content"> {{$contents->contents}} </div> <div class="vertical-align"> <div class="col-md-8"></div> <div class="col-md-3 text-right "> <div class="btn-group" role="group"> @if (Session::has('login')) <button type="button" id="editFormBtn" class="btn btn-default">수정</button> <button type="button" id="delBtn" class="btn btn-default">삭제</button> @endif <button type="button" id="listBtn" class="btn btn-default">목록</button> </div> </div>
  • 19. 게시물 보기 컨텐츠 1 <div class="col-md-1 btn-group text-right"> @if (Session::has('login')) <button class="btn btn-default" id="logoutBtn" type="button"> 로그아웃 </button> @else <button class="btn btn-default" id="loginFormBtn" type="button"> 로그인 </button> @endif </div> </div> <script> $(document).ready(function(){ $("#editFormBtn").click(function(){ location.href = "/edit-form?pageid={{$pageid}}"; }); $("#delBtn").click(function(){ location.href = "/delete?pageid={{$pageid}}"; }); $("#listBtn").click(function(){ location.href = "/list"; }); $("#loginFormBtn").click(function(){ location.href = "/login-form"; }); $("#logoutBtn").click(function(){ location.href = "/logout"; }); }); </script> @stop
  • 23. 기본 스키마 생성 CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, email VARCHAR(45) NULL, password VARCHAR(45) NULL, name VARCHAR(45) NULL, PRIMARY KEY (id)) ENGINE = InnoDB; CREATE TABLE contents ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, title VARCHAR(45) NULL, contents TEXT NULL, reg_user_id INT NOT NULL, reg_user_name VARCHAR(45) NULL, view_count INT NULL DEFAULT 0, updated_at TIMESTAMP NULL, created_at TIMESTAMP NULL, PRIMARY KEY (id), INDEX fk_contents_users_idx (reg_user_id ASC), CONSTRAINT fk_contents_users FOREIGN KEY (reg_user_id) REFERENCES abcd_db.users (id) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB;
  • 24. 회원 정보 입력 insert into users (email, password, name) values ( '[email protected]', password('1234'), 'test user'); insert into users (email, password, name) values ( ‘[email protected]’, password('1234'), ‘Jamie Han');
  • 27. 모델 생성 콘솔 홈 디렉토리로 이동1 cd ~/Documents/laravel-space/abcd cd C:laravel-spaceabcd 2 php artisan make:model BoardUser php artisan make:model BoardContents app/BoardContents.php app/BoardUser.php3 파일 생성 확인
  • 28. BoardUser 모델 app/BoardUser.php <?php namespace App; use IlluminateDatabaseEloquentModel; class BoardUser extends Model { protected $table = 'users'; protected $fillable = ['id', 'email', 'password', 'name']; protected $hidden = ['password']; }
  • 29. BoardContents 모델 app/BoardContents.php <?php namespace App; use IlluminateDatabaseEloquentModel; class BoardContents extends Model { protected $table = 'contents'; protected $fillable = ['id', 'title', 'reg_user_id', 'reg_user_name', 'view_count', 'updated_at', 'created_at' ]; protected $hidden = []; }
  • 31. routes.php /* Board */ Route::get('/login-form', 'BoardController@loginForm'); Route::post('/login', 'BoardController@login'); Route::get('/logout', 'BoardController@logout'); Route::get('/add-form', 'BoardController@addForm'); Route::post('/add', 'BoardController@add'); Route::get('/edit-form', 'BoardController@editForm'); Route::post('/edit', 'BoardController@edit'); Route::get('/delete', 'BoardController@delete'); Route::get('/list', 'BoardController@listView'); Route::get('/view', 'BoardController@view'); app/Http/routes.php
  • 33. 컨트롤러 생성 콘솔 홈 디렉토리로 이동1 cd ~/Documents/laravel-space/abcd cd C:laravel-spaceabcd 2 3 파일 생성 확인 php artisan make:controller BoardController app/Http/Controllers/BoardController.php
  • 34. 코딩 위치 app/Http/Controllers/BoardController.php class BoardController extends Controller { 기본 생성 함수 삭제후 코딩 } use AppBoardContents; use AppBoardUser; 다음라인 추가
  • 35. 로그인 public function loginForm() { return view('board.contents.login'); } public function login(Request $request) { $email = $request->input('email'); $password = $request->input('password'); $user = BoardUser::whereRaw('email = ? and password = password(?)', [$email, $password] ); if ( $user->count() > 0 ) { // 로그인 성공 $request->session()->put('login', true); $request->session()->put('user_id', $user->get()[0]->id); $request->session()->put('user_name', $user->get()[0]->name); return redirect('/list'); } else { // 로그인 실패 return redirect('/login-form'); } }
  • 37. 게시물 등록 public function addForm() { return view('board.contents.add'); } public function add(Request $request) { $title = $request->input('title'); $contents = $request->input('contents'); $boardContents = new BoardContents(); $boardContents->title = $title; $boardContents->contents = $contents; $boardContents->reg_user_id = $request->session()->get('user_id'); $boardContents->reg_user_name = $request->session()->get('user_name'); $boardContents->save(); return redirect('/list'); }
  • 39. 게시물 목록 public function listView() { // 페이지네이션 사용 $contents = BoardContents::orderBy('id', 'desc')->paginate(5); $contents->setPath('/list'); return view('board.contents.list')->with('contents', $contents); }
  • 41. 게시물 수정 public function editForm(Request $request) { $pageid = $request->input('pageid'); $boardContents = BoardContents::find($pageid); return view('board.contents.edit')->with('contents', $boardContents) ->with('pageid', $pageid); } public function edit(Request $request) { $pageid = $request->input('pageid'); $title = $request->input('title'); $contents = $request->input('contents'); $boardContents = BoardContents::find($pageid); $boardContents->title = $title; $boardContents->contents = $contents; $boardContents->save(); return redirect('/view?pageid='.$pageid); }
  • 43. 게시물 삭제 public function delete(Request $request) { $pageid = $request->input('pageid'); $boardContents = BoardContents::whereRaw('id = ?', [$pageid]); $boardContents->delete(); return redirect('/list'); }
  • 45. 로그아웃 public function logout(Request $request) { $request->session()->flush(); return redirect('/list'); }
  • 47. 게시물 보기 public function view(Request $request) { $pageid = $request->input('pageid'); BoardContents::whereRaw('id = ?', [$pageid])->increment('view_count'); $contents = BoardContents::find($pageid); return view(‘board.contents.view')-> with('contents', $contents)->with('pageid', $pageid); }
  • 50. 게시판 소스는 꼭 한번 해보시고 수정해보세요. 그러면 라라벨 웹개발 프로세스를 이해하시는데 큰도움이 될거라 생각합니다. 이번 과정이 모두 끝났습니다. 그동안 정말 수고하셨습니다. :) 궁금하신 부분은 슬렉으로 문의 주세요. http://abcds.kr/wp-login.php?action=slack-invitation https://abcds.slack.com