1. 모델,마이그레이션,컨트롤러 만들기

php artisan make:model Workplan -mcr


2. 라우트 설정

Route::resource('/workplan', 'WorkplanController');


3. master.blade.php 파일에 링크등록

<a class="item" href="/workplan">
작업지시2
</a>


4. 스키마 작성

Schema::create('workplans', function (Blueprint $table) {
$table->bigIncrements('id'); #아이디
$table->string('work_no'); #작업넘버
$table->string('title')->nullable(); #제목
$table->string('project_name'); #프로젝트네임
$table->string('project_code')->nullable(); #프로젝트코드
$table->string('board_name')->nullable(); #보드네임
$table->string('assy')->nullable(); #assy네임
$table->integer('ea'); #수량
$table->string('set_set')->nullable(); #편성
$table->string('start_product_date')->nullable(); #작업시작일
$table->string('end_product_date')->nullable(); #작업완료일
$table->string('status')->default("진행"); #진행상황
$table->integer('material_settiog')->default(0); #자재준비
$table->integer('smt')->default(0); #설비공수
$table->integer('dip')->default(0); #dip공수
$table->integer('aoi')->default(0); #aoi공수
$table->integer('wave')->default(0); #웨이브솔더링, 컷팅 공수
$table->integer('touchup')->default(0); #터치업 공수
$table->integer('item_inspection')->default(0); #단품검사 공수
$table->integer('coting')->default(0); #코팅 공수
$table->integer('ass')->default(0); #assy 공수
$table->integer('packing')->default(0); #포장 공수
$table->integer('ready')->default(0); #준비 공수
$table->integer('ect1')->default(0); #기타1
$table->integer('ect2')->default(0); #기타2
$table->integer('wo')->default(0);
$table->integer('per')->default(0);
$table->text('memo')->nullable(); #메모
$table->integer('con')->default(0); #1은 완료 0은 작업중
$table->string('wr_user'); #글쓴이
$table->timestamps();
});


5. 가짜데이터 삽입


6. WorkplanController.php 목록보기 작성

public function index()
{
$workplans = \App\Workplan::latest()->paginate(15);

return view('workplan.index',compact('workplans'));
}


7. view/workplan/index.blade.php 목록보기 파일생성


8. index.blade.php 파일 작성

@extends('master')

@section('content')

<h1>실시간 작업 리스트 & 공수입력
@if(Auth::check())
@if(auth()->user()->level >= 3)
<a class="ui primary button" href="/workplan/create">추가하기</a>
@endif
@endif
</h1>

<div class="ui relaxed divided list">
@foreach($workplans as $workplan)

<div class="item">
<i class="play middle aligned icon">&nbsp;{{ $workplan->id }}</i>
<div class="content">
<div class="right floated content">
<div class="ui button">
<font style="vertical-align: inherit;">더하다</font>
</div>
</div>
<a class="header">
<font style="vertical-align: inherit;">
<a href="/posts/{{$workplan->id}}">
<h3>{{ $workplan->title }}</h3>
</a>
</font>
<div class="description">
<font style="vertical-align: inherit;">{{ $workplan->memo }}</font>
</div>
</div>
</div>

@endforeach
</div>


{{-- 페이지네이션 --}}
@if($workplans->count())
{{ $workplans->links() }}
@endif

<br>
<br>

@endsection


9. WorkplanController.php 글 작성 페이지 create()메서드

public function create()
{
//프로젝트명 가져오기
$project_lists = \App\Project::get();

//보드명 가져오기
$board_names = \App\Boardname::all();


return view('workplan.create', compact('project_lists', 'board_names'));
}


10. views/workplan/create.blade.php

@extends('master')

@section('content')

<h1>작업지시 작성하기</h1>

<div class="ui stackable two column grid">

<div class="column">

<form class="ui form" method="POST" action="/workplan">
@csrf

<div class="field">
<label>작업명</label>
<input class="input {{ $errors->has('title') ? 'is-danger' : '' }}" type="text" name="title"
value="{{ old('title') }}" placeholder="작업명">
</div>


<div class="{{ $errors->has('project_name') ? 'field error' : 'field' }}">
<div class="ui selection dropdown">
<input type="hidden" name="project_name" value="{{ old('project_name') }}" required>
<i class="dropdown icon"></i>
<div class="default text" style="color: black">프로젝트명</div>
<div class="menu">
@foreach ($project_lists as $project_list)
<div class="item">{{$project_list->project_name }}</div>
@endforeach
</div>
</div>
</div>

<div class="field">
<div class="ui selection dropdown">
<input type="hidden" name="project_code" value="{{ old('project_code') }}">
<i class="dropdown icon"></i>
<div class="default text" style="color: black">프로젝트코드</div>
<div class="menu">
@foreach ($project_lists as $project_list)
<div class="item">{{$project_list->project_code }}</div>
@endforeach
</div>
</div>
</div>

<div class="field">
<div class="ui selection dropdown">
<input type="hidden" name="board_name" value="">
<i class="dropdown icon"></i>
<div class="default text" style="color: black">보드명</div>

<div class="menu">
@foreach($board_names as $board_name)
<div class="item">{{ $board_name->boardname }}</div>
@endforeach
</div>

</div>
</div>

<div class="field">
<label>ASSY명</label>
<input class="input {{ $errors->has('ass') ? 'is-danger' : '' }}" type="text" name="ass"
value="{{ old('ass') }}" placeholder="ASSY명">
</div>

<div class="{{ $errors->has('ea') ? 'field error' : 'field' }}">
<label>수량</label>
<input class="input" type="number" name="ea" value="{{ old('ea') }}" placeholder="수량" required>
</div>

<div class="field">
<label>편성</label>
<input class="input {{ $errors->has('set_set') ? 'is-danger' : '' }}" type="number" name="set_set"
value="{{ old('set_set') }}" placeholder="편성">
</div>

<?php $dd = date("Y-m-d")?>
<div class="field">
<label>생산시작일</label>
<input type="date" name="start_product_date" value="<?=$dd?>" placeholder="생산시작일">
</div>

<div class="field">
<label>생산완료일</label>
<input type="date" name="end_product_date" value="<?=$dd?>" placeholder="생산완료일">
</div>


<div class="field">
<label>메모</label>
<input class="input {{ $errors->has('memo') ? 'is-danger' : '' }}" type="text" name="memo"
value="{{ old('memo') }}" placeholder="메모">
</div>


<div class="field">
<button class="ui button" type="submit">작성완료</button>
</div>
</form>
@if($errors->any())
<div class="ui pink inverted segment">

<ul>
@foreach ($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
</div>

</div>
@endsection


11. WorkplanController.php 글 작성 페이지 store()메서드 로 데이터가 넘겨지는지 확인

public function store(Request $request)
{
dd(request()->all());
}


12. store() 메서드에 유효성 검사와 데이터 입력 작성

public function store(Request $request)
{

$rules = [
'title' => 'required',
'project_name' => ['required'],
'ea' => ['required'],
];

$messages = [
'title.required' => '제목은 필수 입력 항목 입니다.',
'project_name.required' => '프로젝트는 필수 입력 항목 입니다.',
'ea.required' => '수량은 필수 입력 항목 입니다.',
];

$validator = \Validator::make($request->all(), $rules, $messages);

if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}

//작업지시는 현재년,월,일 번호로 2019090001
//dump(\Config::get('my_carbon.NOW_YMD')); //"2019년 09월 01일"
$Y = (\Config::get('my_carbon.NOW_Y')); //"2019"
$M = (\Config::get('my_carbon.NOW_M')); //"09"
$D = (\Config::get('my_carbon.NOW_D')); //"01"

//날짜 201909
$YMD = $Y . $M;

//작업지시번호 최근꺼 가져오기
$work = Workplan::latest()->pluck('work_no');

//dd($work);

//컬렉션이 비어있다면 false
$workCheck = $work->isNotEmpty();


if ($workCheck != false) { //있다면...

//dd($workCheck);

//PBA201909001
$finalWorkNumberNo = $work[0];

//dd($finalWorkNumberNo);

//데이터베이스 현제 년월 201909
$DbYM = substr($finalWorkNumberNo, 3, 6);

//dd($DbYM);

//데이터베이스 뒤에서 세자리만 가져온다 001
$NumberNo = substr($finalWorkNumberNo, 9, 11);
//$NumberNo = sprintf('%03d',$NumberNo);
//dd($NumberNo);


if ($YMD != $DbYM) { //현재년월과 데이터베이스년월이 다르면
// 카운터 0001
$count = sprintf('%03d', 1);
} else {
$NumberNo = $NumberNo + 1;
//dd($NumberNo);
$count = sprintf('%03d', $NumberNo);
}

//dd('있어');

} else { //없다면

$YMD = $Y . $M;
$count = sprintf('%03d', 1);
}

// 접두
$prefix = "PBA";

//다만든 작업지시번호
$completeWorkNo = $prefix . $YMD . $count;


Workplan::create([
'work_no' => $completeWorkNo,
'title' => request('title'),
'project_name' => request('project_name'),
'project_code' => request('project_code'),
'board_name' => request('board_name'),
'assy' => request('assy'),
'ea' => request('ea'),
'set_set' => request('set_set'),
'start_product_date' => request('start_product_date'),
'end_product_date' => request('end_product_date'),
'memo' => request('memo'),
'ass' => 0,
'wr_user' => auth()->user()->name, //입력한 사용자

]);
Alert::success('작업 지시 완료', '작업 지시가 완료 되었습니다.');
return redirect('/workplan');
}


13. 목록 디자인을 변경하자



'라라벨 > 기능구현' 카테고리의 다른 글

로그인 유저타입으로 로그인후 경로변경  (0) 2020.03.09

fopen(/var/www/html/pcb/public/uploads/images/_1583563453.jpg): failed to open stream: Permission denied


프로파일 이미지가 404가뜨거나 권한이 없다고 나오면..



1.  php artisan make:controller Api/BookableAvailabilityController --invokable

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class BookableAvailabilityController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
//
}
}



2. 경로추가 

Route::get('bookables/{bookable}/availability', 'Api\BookableAvailabilityController')->name('bookables.availability.show');


3. 확인

php artisan route:list


4. BookableAvailabilityController.php 덤프확인메시지 작성

public function __invoke(Request $request)
{
dd('Hi~ BookableAvailabilityController' );
}


5. 포스트맨으로 요청확인


'라라벨 > laravelbnb' 카테고리의 다른 글

29. Booking팩토리만들기  (0) 2020.03.05
28. 예약 모델만들기 관계설정  (0) 2020.03.04

1. BookingFactory 만들기

php artisan make:factory BookingFactory


2. 테이블


3. 팩토리 소스작성

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Booking;
use Carbon\Carbon;
use Faker\Generator as Faker;

$factory->define(Booking::class, function (Faker $faker) {

//한달전과 앞으로 한달 사이의 랜덤 날찌
$from = Carbon::instance($faker->dateTimeBetween('-1 months', '+1 months'));

//from 복제 후 random int로 0~14사이의 값을 랜던생성
$to = (clone $from)->addDays(random_int(0,14));

return [
'from' => $from,
'to' => $to
];
});


4. BookingsTableSeeder 만들기

php artisan make:seeder BookingsTableSeeder


5. 소스 작성

<?php

use App\Bookable;
use App\Booking;
use Illuminate\Database\Seeder;

class BookingsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Bookable::all()->each(function(Bookable $bookable){
$booking = factory(Booking::class)->make();
$bookings = collect([$booking]);

// 1~20의 예약 생성
for($i = 0; $i < random_int(1, 20); $i++){
$from = (clone $booking->to)->addDays(random_int(1,14));
$to = (clone $from)->addDays(random_int(0,14));


$booking = Booking::make([
'from' => $from,
'to' => $to
]);
$bookings->push($booking);
}

$bookable->bookings()->saveMany($bookings);

});
}
}


6. DatabaseSeeder.php  시더 추가

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
$this->call(BookablesTableSeeder::class);
$this->call(BookingsTableSeeder::class);
}
}


7. 마이그레이션 재실행

php artisan migrate:refresh --seed


8. 만들어진 데이터


'라라벨 > laravelbnb' 카테고리의 다른 글

30. 싱글액션컨트롤러만들기  (0) 2020.03.05
28. 예약 모델만들기 관계설정  (0) 2020.03.04

1. 모델 마이그레이션 생성

php artisan make:model Booking -m


2. TIMESTAMP_create_bookings_table.php

public function up()
{
Schema::create('bookings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();

$table->date('from');
$table->date('to');

$table->unsignedBigInteger('bookable_id')->index();
$table->foreign('bookable_id')->references('id')->on('bookables');
});
}


3. 마이그레이션

migrate


4. 관계설정

Bookaing.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Booking extends Model
{
public function bookables()
{
return $this->belongsTo(Bookable::class);
}
}


Bookable.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Bookable extends Model
{
public function bookings()
{
return $this->hasMany(Booking::class);
}
}


'라라벨 > laravelbnb' 카테고리의 다른 글

30. 싱글액션컨트롤러만들기  (0) 2020.03.05
29. Booking팩토리만들기  (0) 2020.03.05

1. 컴포저 설치

composer require barryvdh/laravel-debugbar --dev


2. .env 


3. 디버그바 설치화면



https://laravel-news.com/laravel-5-4-key-too-long-error


 app/Providers/AppServiceProvider.php( 노란부분 추가)

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
}


재실행 해보자

<template>
<div>

<div v-if="!loading">
<img class="rounded mx-auto d-block" :src="image" alt="loder">
</div>

<div v-else>
<button @click="loadCreateModal" class="btn btn-primary btn-block">Add New Task</button>

<table class="table" v-if="tasks">
<thead>
<tr>
<th>id</th>
<th>Name</th>
<th>Body</th>
</tr>
</thead>

<tbody>
<tr v-for="(task, index) in tasks">
<td>{{index + 1}}</td>
<td>{{task.name}}</td>
<td>{{task.body}}</td>
<td>
<button @click="loadUpdateModal(index)" class="btn btn-info">Edit</button>
</td>
<td>
<button @click="deleteTask(index)" class="btn btn-danger">Delete</button>
</td>
</tr>
</tbody>
</table>

<!-- Create Modal -->
<div
class="modal fade"
id="create-modal"
data-backdrop="static"
abindex="-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="staticBackdropLabel">Create Modal</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="alert alert-danger" v-if="errors.length > 0">
<ul>
<li v-for="error in errors">{{error}}</li>
</ul>
</div>

<div class="form-group">
<label for="name">Name</label>
<input v-model="task.name" type="text" id="name" class="form-control" />
</div>

<div class="form-group">
<label for="description">Description</label>
<input v-model="task.body" type="text" id="description" class="form-control" />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button @click="createTask" type="button" class="btn btn-primary">Understood</button>
</div>
</div>
</div>
</div>

<!-- Update Modal -->
<div
class="modal fade"
id="update-modal"
data-backdrop="static"
abindex="-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="staticBackdropLabel">Update Modal</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="alert alert-danger" v-if="errors.length > 0">
<ul>
<li v-for="error in errors">{{error}}</li>
</ul>
</div>

<div class="form-group">
<label for="name">Name</label>
<input v-model="new_update_task.name" type="text" id="name" class="form-control" />
</div>

<div class="form-group">
<label for="description">Description</label>
<input
v-model="new_update_task.body"
type="text"
id="description"
class="form-control"
/>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button @click="updateTask" type="button" class="btn btn-primary">Understood</button>
</div>
</div>
</div>
</div>
</div>
</div>
</template>

<script>
export default {
data() {
return {
task: {
name: "",
body: ""
},

tasks: [],

uri: "http://laravelvuecrud.test/tasks/",
errors: [],
new_update_task: [],
image: 'images/loader3.gif',
loading: false,
toastr: toastr.options = {"positionClass" : "toast-top-full-width"}
};
},

methods: {
//글작성 모달창 오픈
loadCreateModal() {
$("#create-modal").modal("show");
},

//업데이트 모달창 오픈
loadUpdateModal(index) {
this.errors = [];

$("#update-modal").modal("show");

this.new_update_task = this.tasks[index];
},

//데이터 삽입하기
createTask() {
axios
.post(this.uri, { name: this.task.name, body: this.task.body })
.then(response => {
this.tasks.push(response.data.task);

this.resetData();

toastr.success(response.data.message);

$("#create-modal").modal("hide");
})
.catch(error => {
//에러처리

this.errors = [];

if (error.response.data.errors.name) {
this.errors.push(error.response.data.errors.name[0]);
}

if (error.response.data.errors.body) {
this.errors.push(error.response.data.errors.body[0]);
}
});
},

//데이터 업데이트하기
updateTask() {
axios
.patch(this.uri + this.new_update_task.id, {
name: this.new_update_task.name,
body: this.new_update_task.body
})
.then(response => {
//실행후 모달 닫는 로직
$("#update-modal").modal("hide");
toastr.success(response.data.message);
})
.catch(error => {
//에러처리
this.errors = [];

if (error.response.data.errors.name) {
this.errors.push(error.response.data.errors.name[0]);
}

if (error.response.data.errors.body) {
this.errors.push(error.response.data.errors.body[0]);
}
});
},

//데이터 삭제하기
deleteTask(index){

let confirmBox = confirm("정말로 삭제 하시겠습니까?");

if(confirmBox == true){

axios.delete(this.uri + this.tasks[index].id)
.then(response=>{

this.$delete(this.tasks, index);
toastr.success(response.data.message);
}).catch(error=>{

console.log("Could not delete for some reason");

})
}

},

//데이터 불러오기
loadTasks() {
axios.get(this.uri).then(response => {
this.tasks = response.data.tasks;
this.loading = true;
});
},

//리셋데이터 호출
resetData(){

this.task.name = '',
this.task.body = ''
}
},

mounted() {
this.loadTasks();
}
};
</script>


'라라벨 > laravel vue crud' 카테고리의 다른 글

13. 토스트 알림기능만들기  (0) 2020.02.28
12. 로더피처 적용하기  (0) 2020.02.28
11. 글작성 후 데이터가 남는 문제 해결  (0) 2020.02.28
10. Delete  (0) 2020.02.28
9. update  (0) 2020.02.28

+ Recent posts