En este tutorial, aprenderemos cómo crear un sistema CRUD (Create, Read, Update, Delete) utilizando Vue JS en el frontend y Laravel en el backend, con una base de datos MySQL. También utilizaremos Bootstrap para diseñar nuestra interfaz de usuario.
- Crear la base de datos en MySQL:
Lo primero que debemos hacer es crear la base de datos en MySQL. Puedes utilizar phpMyAdmin o cualquier otra herramienta de administración de bases de datos. Puedes ejecutar el siguiente script SQL para crear la base de datos y la tabla que utilizaremos en este tutorial:
CREATE DATABASE vuejs_crud;
USE vuejs_crud;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
- Crear el proyecto Laravel:
Para crear el proyecto Laravel, puedes seguir los siguientes pasos:
composer create-project --prefer-dist laravel/laravel vuejs-crud
Esto creará un nuevo proyecto de Laravel llamado vuejs-crud en un directorio llamado vuejs-crud. Luego, puedes configurar la conexión a la base de datos en el archivo .env.
- Crear el modelo y el controlador en Laravel:
Para crear el modelo y el controlador en Laravel, puedes utilizar el siguiente comando Artisan:
php artisan make:model User -mcr
Esto creará el modelo User y el controlador UserController con los métodos básicos CRUD. Luego, puedes actualizar el archivo de migración en la carpeta database/migrations para que coincida con la estructura de la tabla de la base de datos que creamos anteriormente.
Una vez que hayas actualizado la migración, puedes ejecutar el siguiente comando para migrar la base de datos y crear la tabla users:
php artisan migrate
- Crear las rutas y los métodos en el controlador:
A continuación, debemos crear las rutas y los métodos en el controlador para que nuestro frontend pueda interactuar con los datos. Puedes agregar las siguientes rutas en el archivo routes/web.php:
Route::get('users', 'UserController@index');
Route::post('users', 'UserController@store');
Route::get('users/{user}', 'UserController@show');
Route::put('users/{user}', 'UserController@update');
Route::delete('users/{user}', 'UserController@destroy');
Luego, puedes implementar los métodos en el controlador UserController para que puedan devolver los datos de la tabla users.
- Crear el frontend con Vue JS:
Ahora, necesitamos crear el frontend utilizando Vue JS. Puedes crear un nuevo componente en la carpeta resources/js/components para manejar la parte de frontend de nuestra aplicación. Puedes crear un componente Users.vue con el siguiente código:
<template>
<div>
<h1>Users</h1>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Email</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr v-for="user in users" :key="user.id">
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.email }}</td>
<td>
<button @click="editUser(user)">Edit</button>
<button @click="deleteUser(user)">Delete</button>
</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
data() {
return {
users: []
};
},
mounted() {
this.getUsers();
},
methods: {
async getUsers() {
let response = await fetch('/api/users');
this.users = await response.json();
},
async editUser(user) {
// Implementar lógica para editar usuario
},
async deleteUser(user) {
// Implementar lógica para eliminar usuario
}
}
};
</script>
- Consumir la API REST desde el frontend:
Finalmente, necesitamos consumir la API REST que creamos en Laravel desde nuestro frontend Vue JS. Para hacer esto, podemos utilizar la función fetch en los métodos de nuestro componente Users.vue para realizar peticiones HTTP a las rutas que definimos en Laravel.
Con esto, tienes un sistema CRUD completo utilizando Vue JS, Laravel, MySQL y Bootstrap. Puedes personalizar y ampliar este proyecto según tus necesidades. ¡Espero que este tutorial haya sido útil!
En el titulo esta mal escrito Bootstrap. detallitos, saludos
Muy buen curso, gracias por tu tiempo profe
Hola, me sale un error indicando el icono no esta definido, al momento de eliminar , tengo el código igual al tuyo pero este sale al momento de dar click en el botón y aunque permite el borrado no entiendo por que sale el error siendo que el icono si esta declarado
Swall.fire({
title:titulo,
icon:icono,
customClass:{confirmButton:'btn btn-primay', popup:'animated zoomIn'},
buttonsStyling:false
});
Falt la parte de agregar el estudiante a un curso
excelente inicio para aprender
Ya corregi todos los errores!!! el programa quedo fabuloso, solo queda pendiente la parte de autenticación de login y el deploy ¿puedes darme algiuna referencia donde consulte estos puntos?
Min 2:50:59 enm la consola aparece: "Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received"
¿que hago aqui?
Gracias hermano, acabo de terminar el proyecto, tuve algunos inconvenientes pero logré terminarlo todo.
3:18:00 Estoy siguiendo este proyecto para hacer uno diferente, pero en mi caso en este punto del video al enviar el request POST me generaba un error, el error se soluciona yendo a la etiqueta form y cuando pongan el v-on:submit agreguen .prevent (ejm: <form v-on:submit.prevent="guardar"> )
buen video, pero noto que te saltaste una parte de la creación del controller Estudiante y cuando estás haciendo lo de postman esas rutas ya la tenias creadas y así quede perdido
Disculpa tendaras alguno con vuejs 3
Oigan en el minuto 55:30 cuando creo el conttrolador de estudiante o como lo creo auntomatico por que no parace en mis controladores no se si perjudique si lo hago desde cero
Excelente video. Tengo una duda… porqué al momento de ver el detalle volvemos a consumir un servicio? No seria mejor mandar todo el objeto del estudiante? ya que la información no va a cambiar y se usan los mismos campos que ya se obtienen en el listado.
Buenas, en la funcion confirmar de junciones.js el Profe deja esto:
…
Swall.fire({
title:titulo,
icon:icono,
customClass:{confirmButton:'btn btn-primay', popup:'animated zoomIn'},
buttonsStyling:false
});
Pero a mi me sale un error que dice que icono no esta definido en la funcion confirmar. Al profe no le sale eso. Yo se lo quite y ya me funciona bien, pero la pregunta es ?porque?
engo una duda como puedo guardar un archivo en vue 3 + php y mysql Payload enviado al servidor:
Object
accion
:
"registrar"
publicacion
:
{titulo: 'hambre', articulo_id: '8', usuario_id: '1', imagen1: '4056383.jpg'}
[[Prototype]]
:
Object SE GUARDABIEN MI BASE EATOS imagen1: '4056383.jpg' PERO YO QUIERO EL ARCHIVO QUE SE GUARE EN LA CAPERTA RAIZ DE MI PROYECTO
Está súper chévere, pero fuera un poquito más completo si le hubiera agregado autentificación 🙊
cuando vi que era en vue2 me desanime
gracias excelente vídeo, seria bueno uno de django con vuejs🙏🙏
Para los que se perdieron con lo del controlador del estudiante ejecutan este comando en el terminal
php artisan make:controller EstudiantesController -r
y por si no les genera la libreria se la añaden
use AppModelsEstudiante;
con eso se los genera!
Gracias Master, super explicado. Saludos desde Lambayeque- Perú