Articles

A’ cruthachadh App CRUD le Laravel agus Vue.js

San oideachadh seo chì sinn còmhla mar a sgrìobhas tu còd eisimpleir CRUD App, le Laravel agus Vue.js.

La Iarrtas Duilleag Singilte leigidh sinn leinn cearcall de ghnìomhachdan bunaiteach a chrìochnachadh air DB: cruthaich, leugh, ùraich agus cuir às le Vue.js , Routers Vue agus Frèam Laravel .

An-diugh, is e Angular JS agus Vue JS na frèaman JS as mòr-chòrdte. Tha Angular JS agus Vue JS nam frèaman JS furasta a chleachdadh agus as mòr-chòrdte. Bidh e a ’toirt seachad riaghladh air a’ phròiseact no an tagradh gu lèir gun a bhith ag ùrachadh na duilleige agus dearbhadh cumhachdach jquery.

Bidh Vue a’ tighinn ro-phacaichte le Laravel (còmhla ri Measgachadh Laravel , inneal sgrìobhaidh sàr-mhath stèidhichte air pasgan lìn ).

Riatanasan an fhrithealaiche

PHP 7.4

Laravel 8.x.

MySQL

Stàlaich am pròiseact Laravel

An toiseach, fosgail Terminal agus ruith an àithne a leanas gus pròiseact laravel ùr a chruthachadh:

composer create-project --prefer-dist laravel/laravel crud-spa

no, ma chuir thu a-steach Laravel Installer mar sgrìobhadair-ciùil eisimeileachd cruinneil:

laravel new crud-spa

Dèan rèiteachadh air an stòr-dàta:

Às deidh an stàladh Rach gu eòlaire freumh a’ phròiseict agad, fosgail am faidhle .env agus suidhich mion-fhiosrachadh an stòr-dàta mar a leanas:

DB_CONNECTION=mysql 
DB_HOST=127.0.0.1 
DB_PORT=3306 
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>

Stàlaich eisimeileachd npm

Ruith an àithne a leanas gus na h-eisimeileachd aghaidh aghaidh a stàladh:

npm install

Às deidh sin, stàlaich sealladh ,  vue-router  e vue-axios . Thèid Vue-axios a chleachdadh gus an API backend Laravel a ghairm. Ruith an àithne a leanas air a’ chrìoch:

npm install vue vue-router vue-axios --save

Cruthaich imrich, modail agus rianadair

Cruthaich teamplaid roinn-seòrsa, imrich, agus rianadair. Ruith an òrdugh a leanas airson sin:

php artisan make:model Category -mcr

- mcr  cruthaichidh an cuspair seo Modail, Imrich agus Rianadair a’ cleachdadh synthesis aon-àithne.

A-nis, fosgail am faidhle imrich roinn bho stòran-dàta / imrich agus cuir a-steach an còd a-steach don ghnìomh suas() :

public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('title');
        $table->text('description');
        $table->timestamps();
    });
}

Imrich an stòr-dàta leis an òrdugh a leanas:

php artisan migrate

A-nis, fosgail an teamplaid Category.php bhoapp/Models  agus deasaich an còd san fhaidhle model Roinn-seòrsa.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'];

}

?>

Às deidh sin, fosgail Roinn-riaghlaidh.php agus cuir an còd sa chlàr-amais, stòradh, ùrachadh agus cuir às do dhòighean mar a leanas:

<?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!!'
        ]);
    }
}

Deficuir crìoch air na Slighean ann an web.php

Ora deficrìochnaich iad routes ann am faidhlichean lìn.php e api.php . Rach gu pasgan routes agus fosgail am faidhle web.php agus api.php agus ùraich na leanas routes:

routes/web.php

Leabhar-latha ùr-ghnàthachaidh
Na caill na naidheachdan as cudromaiche mu ùr-ghnàthachadh. Clàraich gus am faighinn air post-d.
<?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']);

Cruthaich app Vue

Anns a 'cheum seo, rachaibh chun an eòlaire goireas/seallaidhean, cruthaich am faidhle app.blade.php  agus cuir ris a’ chòd a leanas 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>

Cruthaich co-phàirt airson app Vue

Anns a 'cheum seo, a dhol dhan phasgan resource/js, cruthaich am pasgan components  agus cruthaich na faidhlichean mar a leanas:

  • View app
  • Welcome.vue
  • Category/List.vue
  • Category/Add.vue
  • Category/Edit.vue

app. vue  is e am prìomh fhaidhle den app Vue againn. Deficriochnaichidh sinn router-sealladh  anns an fhaidhle sin. Nochdaidh a h-uile slighe san fhaidhle app. vue  .

Fosgail am faidhle Welcome.vue agus ùraich an còd a leanas san fhaidhle sin:

<template>
    <div class="container mt-5">
        <div class="col-12 text-center">
            <h1>Laravel Vuejs CRUD</h1>
        </div>
    </div>
</template>

Fosgail am faidhle App.vue agus ùraich an còd mar a leanas:

<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>

An uairsin, fosgail resource / js / components / category / List.vue  agus cuir an còd a leanas san fhaidhle:

<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>

Às deidh sin, fosgail  resource /js/components/category/Add.vue  agus ùraich an còd a leanas san fhaidhle:

<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>

Às deidh sin, fosgail  resource /js/components/category/Edit.vue  agus ùraich an còd a leanas san fhaidhle:


<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>

DefiCuir crìoch air an t-slighe chun app CRUD ann an Vue Router

A-nis, feumaidh tu deficuir crìoch air Vue routes, agus airson seo a dhèanamh rachaibh chun phasgan  resource / js , cruthaich am faidhle route.js  agus ùraich an còd a leanas san fhaidhle:

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
    }
]

An seo tha sinn air co-phàirtean a chleachdadh luchdachadh slaodachAch JS a’ riaghladh luchdachadh phàirtean ann an dòigh lazy le slighean, mar sin air an DOM chan urrainn dhut pàirtean a luchdachadh ach nuair a tha feum orra tro shlighean.

Cuir a-steach eisimeileachd Vue.js ann an app.js

A-nis feumaidh tu a h-uile slighe, vue-axios agus eisimeileachd eile a chur ris.

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),
});

Ùraich webpack.mix.js

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();

Ruith am frithealaiche leasachaidh

Fosgail ceann-uidhe agus ruith an òrdugh seo:

npm run watch
php artisan serve

A 'Ghiblean aoigheachd ionadail: 8000 anns a' bhrabhsair.

BlogInnovazione.it

Leabhar-latha ùr-ghnàthachaidh
Na caill na naidheachdan as cudromaiche mu ùr-ghnàthachadh. Clàraich gus am faighinn air post-d.

Altan o chionn ghoirid

Tha Veeam a’ nochdadh an taic as coileanta airson ransomware, bho dhìon gu freagairt agus faighinn seachad air

Leanaidh Coveware le Veeam a’ toirt seachad seirbheisean freagairt tachartas saidhbear. Bidh Coveware a’ tabhann comasan forensics agus leigheas…

23 Giblean 2024

Ar-a-mach Uaine is Didseatach: Mar a tha cumail suas ro-innseach ag atharrachadh gnìomhachas na h-ola is a’ ghas

Tha cumail suas ro-innse ag atharrachadh roinn na h-ola & gas, le dòigh-obrach ùr-ghnàthach agus for-ghnìomhach a thaobh riaghladh planntrais.…

22 Giblean 2024

Riaghladair antitrust na RA a’ togail inneal-rabhaidh BigTech thairis air GenAI

Tha CMA na RA air rabhadh a chuir a-mach mu ghiùlan Big Tech anns a’ mhargaidh fiosrachaidh fuadain. An sin…

18 Giblean 2024

Casa Green: tionndadh lùtha airson àm ri teachd seasmhach san Eadailt

Tha an t-òrdugh “Taighean Uaine”, a chuir an Aonadh Eòrpach ri chèile gus èifeachdas lùtha thogalaichean a neartachadh, air a phròiseas reachdail a thoirt gu crìch le…

18 Giblean 2024