La Додаток для однієї сторінки дозволить нам виконати цикл базових операцій над БД: створення, читання, оновлення та видалення Vue.js , маршрутизатори Vue і Laravel Framework .
Зараз найпопулярнішими JS-фреймворками є Angular JS і Vue JS. Angular JS і Vue JS є дуже зручними та найпопулярнішими фреймворками JS. Він забезпечує керування всім проектом або програмою без оновлення сторінки та потужної перевірки jquery.
Vue постачається попередньо запакованим разом із Laravel (разом із Суміш Ларавел , чудовий інструмент для створення на основі веб-пакет ) і дозволяє розробникам розпочати створення складних односторінкових програм, не турбуючись про транспилери, пакети коду, вихідні карти чи інші «брудні» аспекти сучасної розробки інтерфейсу.
Php 7.4 XNUMX XNUMX
Laravel 8.x
MySQL
Спочатку відкрийте термінал і виконайте таку команду, щоб створити новий проект laravel:
composer create-project --prefer-dist laravel/laravel crud-spa
або, якщо ви встановили Laravel Installer як глобальну залежність композитора:
laravel new crud-spa
Після інсталяції Перейдіть до кореневого каталогу проекту, відкрийте файл .env і встановіть дані бази даних таким чином:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>
Виконайте таку команду, щоб установити зовнішні залежності:
npm install
Після цього встановіть вид , vue-маршрутизатор e vue-axios . Vue-axios буде використовуватися для виклику Laravel backend API. Виконайте таку команду на терміналі:
npm install vue vue-router vue-axios --save
Створіть шаблон категорії, міграцію та контролер. Для цього виконайте таку команду:
php artisan make:model Category -mcr
-mcr у цій темі буде створено модель, міграцію та контролер за допомогою синтезу однієї команди.
Тепер відкрийте файл міграції категорії з баз даних / мігр і замініть код у функцію вгору() :
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('title');
$table->text('description');
$table->timestamps();
});
}
Перенесіть базу даних за допомогою такої команди:
php artisan migrate
Тепер відкрийте шаблон Category.php зapp/Models
і відредагуйте код у файлі model
Category.php :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model {
use HasFactory;
protected $fillable = ['title','description'];
}
?>
Після цього відкрийте CategoryController.php і додайте код у методи індексування, зберігання, оновлення та видалення наступним чином:
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use Illuminate\Http\Request;
class CategoryController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$categories = Category::all(['id','title','description']);
return response()->json($categories);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$category = Category::create($request->post());
return response()->json([
'message'=>'Category Created Successfully!!',
'category'=>$category
]);
}
/**
* Display the specified resource.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function show(Category $category)
{
return response()->json($category);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Category $category)
{
$category->fill($request->post())->save();
return response()->json([
'message'=>'Category Updated Successfully!!',
'category'=>$category
]);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Category $category
* @return \Illuminate\Http\Response
*/
public function destroy(Category $category)
{
$category->delete();
return response()->json([
'message'=>'Category Deleted Successfully!!'
]);
}
}
Ora defiзакінчити їх routes
у файлах web.php e api.php . Перейти до папки routes
і відкрийте файли web.php і api.php і оновіть наступне routes
:
routes/web.php
<?php
Route::get('{any}', function () {
return view('app');
})->where('any', '.*');
routes/api.php
<?php
Route::resource('category',App\Http\Controllers\CategoryController::class)->only(['index','store','show','update','destroy']);
На цьому кроці перейдіть до каталогу ресурс/перегляди, створіть файл app.blade.php і додайте наступний код 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">
<meta name="csrf-token" value="{{ csrf_token() }}"/>
<title>Laravel Vue CRUD App</title>
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<link href="{{ mix('css/app.css') }}" type="text/css" rel="stylesheet"/>
</head>
<body>
<div id="app">
</div>
<script src="{{ mix('js/app.js') }}" type="text/javascript"></script>
</body>
</html>
На цьому кроці перейдіть до папки resource/js
, створіть папку components
і створіть файли наступним чином:
View app
Welcome.vue
Category/List.vue
Category/Add.vue
Category/Edit.vue
прибл це основний файл нашої програми Vue. Defiми закінчимо перегляд маршрутизатора у цьому файлі. Усі шляхи з’являться у файлі прибл .
Відкрийте файл Welcome.vue
і оновіть наступний код у цьому файлі:
<template>
<div class="container mt-5">
<div class="col-12 text-center">
<h1>Laravel Vuejs CRUD</h1>
</div>
</div>
</template>
Відкрийте файл App.vue і оновіть код таким чином:
<template>
<main>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<router-link to="/" class="navbar-brand" href="#">Laravel Vue Crud App</router-link>
<div class="collapse navbar-collapse">
<div class="navbar-nav">
<router-link exact-active-class="active" to="/" class="nav-item nav-link">Home</router-link>
<router-link exact-active-class="active" to="/category" class="nav-item nav-link">Category</router-link>
</div>
</div>
</div>
</nav>
<div class="container mt-5">
<router-view></router-view>
</div>
</main>
</template>
<script>
export default {}
</script>
Потім відкрийте resource / js / components / category / List.vue
і додайте наступний код у файл:
<template>
<div class="row">
<div class="col-12 mb-2 text-end">
<router-link :to='{name:"categoryAdd"}' class="btn btn-primary">Create</router-link>
</div>
<div class="col-12">
<div class="card">
<div class="card-header">
<h4>Category</h4>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Description</th>
<th>Actions</th>
</tr>
</thead>
<tbody v-if="categories.length > 0">
<tr v-for="(category,key) in categories" :key="key">
<td>{{ category.id }}</td>
<td>{{ category.title }}</td>
<td>{{ category.description }}</td>
<td>
<router-link :to='{name:"categoryEdit",params:{id:category.id}}' class="btn btn-success">Edit</router-link>
<button type="button" @click="deleteCategory(category.id)" class="btn btn-danger">Delete</button>
</td>
</tr>
</tbody>
<tbody v-else>
<tr>
<td colspan="4" align="center">No Categories Found.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name:"categories",
data(){
return {
categories:[]
}
},
mounted(){
this.getCategories()
},
methods:{
async getCategories(){
await this.axios.get('/api/category').then(response=>{
this.categories = response.data
}).catch(error=>{
console.log(error)
this.categories = []
})
},
deleteCategory(id){
if(confirm("Are you sure to delete this category ?")){
this.axios.delete(`/api/category/${id}`).then(response=>{
this.getCategories()
}).catch(error=>{
console.log(error)
})
}
}
}
}
</script>
Після цього відкрийте resource /js/components/category/Add.vue
і оновіть наступний код у файлі:
<template>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h4>Add Category</h4>
</div>
<div class="card-body">
<form @submit.prevent="create">
<div class="row">
<div class="col-12 mb-2">
<div class="form-group">
<label>Title</label>
<input type="text" class="form-control" v-model="category.title">
</div>
</div>
<div class="col-12 mb-2">
<div class="form-group">
<label>Description</label>
<input type="text" class="form-control" v-model="category.description">
</div>
</div>
<div class="col-12">
<button type="submit" class="btn btn-primary">Save</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name:"add-category",
data(){
return {
category:{
title:"",
description:""
}
}
},
methods:{
async create(){
await this.axios.post('/api/category',this.category).then(response=>{
this.$router.push({name:"categoryList"})
}).catch(error=>{
console.log(error)
})
}
}
}
</script>
Після цього відкрийте resource /js/components/category/Edit.vue
і оновіть наступний код у файлі:
<template>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h4>Update Category</h4>
</div>
<div class="card-body">
<form @submit.prevent="update">
<div class="row">
<div class="col-12 mb-2">
<div class="form-group">
<label>Title</label>
<input type="text" class="form-control" v-model="category.title">
</div>
</div>
<div class="col-12 mb-2">
<div class="form-group">
<label>Description</label>
<input type="text" class="form-control" v-model="category.description">
</div>
</div>
<div class="col-12">
<button type="submit" class="btn btn-primary">Update</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name:"update-category",
data(){
return {
category:{
title:"",
description:"",
_method:"patch"
}
}
},
mounted(){
this.showCategory()
},
methods:{
async showCategory(){
await this.axios.get(`/api/category/${this.$route.params.id}`).then(response=>{
const { title, description } = response.data
this.category.title = title
this.category.description = description
}).catch(error=>{
console.log(error)
})
},
async update(){
await this.axios.post(`/api/category/${this.$route.params.id}`,this.category).then(response=>{
this.$router.push({name:"categoryList"})
}).catch(error=>{
console.log(error)
})
}
}
}
</script>
Тепер ви повинні defiзакінчити Vue routes
, і для цього перейдіть до папки resource / js
, створіть файл route.js
і оновіть наступний код у файлі:
const Welcome = () => import('./components/Welcome.vue' /* webpackChunkName: "resource/js/components/welcome" */)
const CategoryList = () => import('./components/category/List.vue' /* webpackChunkName: "resource/js/components/category/list" */)
const CategoryCreate = () => import('./components/category/Add.vue' /* webpackChunkName: "resource/js/components/category/add" */)
const CategoryEdit = () => import('./components/category/Edit.vue' /* webpackChunkName: "resource/js/components/category/edit" */)
export const routes = [
{
name: 'home',
path: '/',
component: Welcome
},
{
name: 'categoryList',
path: '/category',
component: CategoryList
},
{
name: 'categoryEdit',
path: '/category/:id/edit',
component: CategoryEdit
},
{
name: 'categoryAdd',
path: '/category/add',
component: CategoryCreate
}
]
Тут ми використали компоненти повільне завантаження. vue js певним чином керує завантаженням компонентів lazy
із шляхами, тому в DOM ви можете завантажувати компоненти лише тоді, коли вони потрібні через шляхи.
Тепер вам потрібно додати всі шляхи, vue-axios та інші залежності.
resource / js / app.js
require('./bootstrap');
import vue from 'vue'
window.Vue = vue;
import App from './components/App.vue';
import VueRouter from 'vue-router';
import VueAxios from 'vue-axios';
import axios from 'axios';
import {routes} from './routes';
Vue.use(VueRouter);
Vue.use(VueAxios, axios);
const router = new VueRouter({
mode: 'history',
routes: routes
});
const app = new Vue({
el: '#app',
router: router,
render: h => h(App),
});
webpack.mix.js
const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel applications. By default, we are compiling the CSS
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.postCss('resources/css/app.css', 'public/css', [
//
]).vue();
Відкрийте термінал і виконайте цю команду:
npm run watch
php artisan serve
Apri локальний хост: 8000 у браузері.
BlogInnovazione.it
Reply, глобальний консультант і системний інтегратор, а також постачальник хмарних керованих послуг Oracle, оголошує, що отримав…
MasterZ Blockchain підвищує цінність для найбільшого WEB 3.0 Master of excellence в Європі. Повністю італійська команда…
33 фіналісти, обрані з 5.213 заявок у 163 країнах. Фіналісти виступають за ефективні кліматичні заходи та підтримують доступ до чистої енергії,…
Біологічні препарати виникли як інноваційний фармацевтичний клас, який революціонізував галузь медицини завдяки таргетній терапії. ДО…
Інсорсинг принтерів для виробництва металів і полімерів на заводах у Ріомі, Франція та Рок-Хілл, Кароліна…
Аналіз даних без використання бібліотеки за допомогою машинного навчання за допомогою Spectronaut ® 18 забезпечує найкращі в галузі кількісне визначення білка та продуктивність…
Mattermost має розширену екосистему союзників з акцентом на нові варіанти використання рішень Міністерством оборони…
Флагманська платформа United Cloud TV 2.0, надзвичайно популярна під брендом EON TV, отримує потужний захист…
Armis Centrix™ дозволяє організаціям бачити, захищати та керувати всіма віртуальними активами, забезпечуючи захист та керування…
Нанотехнології започаткували нову еру в окулярній доставці ліків, пропонуючи невеликі, але потужні рішення для подолання викликів...