estudijoanpuig - welcome projecte amb laravel 8
panel voyager

hero

Tots els codis

Pots especificar filtre: LARAVEL, o cercar per paraules

css

aplicar css al html

aplicar css al html

El CSS es pot afegir als documents HTML de 3 maneres:

1.-En línia : utilitzant style atribut dins dels elements HTML

style="background-image: url('img/login.png');"


<style type="text/css">
			li {
	           font-size: 1.2rem;
               }		
            </style>


<section class="module p-b-0 bg-dark" id="pagines">

2.-Interna: utilitzant un style element a la head seccio




3.-Extern: utilitzant un  element per enllaçar a un fitxer CSS extern.
filament

filament estructura per la migracio de Code

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

/**
 * Migration auto-generated by TablePlus 4.10.1(202)
 * @author https://tableplus.com
 * @source https://github.com/TablePlus/tabledump
 */
class CreateCodesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('codes', function (Blueprint $table) {
            $table->integer('id')->unsigned()->autoIncrement();
            $table->string('nom', 255);
            $table->string('categoria', 255);
            $table->string('tags', 255);
            $table->text('descripcio')->nullable()->default(NULL);
            $table->longtext('blockcode');
            $table->string('txt', 255)->nullable()->default(NULL);
            $table->string('youtube', 255)->nullable()->default(NULL);
            $table->string('url', 255)->nullable()->default(NULL);
            $table->timestamp('updated_at')->nullable()->default(NULL);
            $table->timestamp('created_at')->nullable()->default(NULL);
        });
    }
   
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('codes');
    }
}
filament

filament estructura migracio per crear la taula objectius

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

/**
 * Migration auto-generated by TablePlus 4.10.1(202)
 * @author https://tableplus.com
 * @source https://github.com/TablePlus/tabledump
 */
class CreateObjectiusTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('objectius', function (Blueprint $table) {
            $table->integer('id')->unsigned()->autoIncrement();
            $table->string('nom', 255);
            $table->text('descripcio');
            $table->string('status', 255);
            $table->string('urlsolucio', 255)->nullable()->default(NULL);
            $table->timestamp('created_at')->nullable()->default(NULL);
            $table->timestamp('updated_at')->nullable()->default(NULL);
        });
    }
   
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('objectius');
    }
}
I EL NOM EN SINGULAR.

previament tinc que tenir instal.lat:

composer require doctrine/dbal
filament">
filament

filament crear un recurs per la taula objectius

en aquest cas i afegeixo al final de l'ordre cmd --generate. I EL NOM EN SINGULAR.

previament tinc que tenir instal.lat:

composer require doctrine/dbal

php artisan make:filament-resource Objectiu --generate
filament

migracio per la taula people

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

/**
 * Migration auto-generated by TablePlus 4.10.1(202)
 * @author https://tableplus.com
 * @source https://github.com/TablePlus/tabledump
 */
class CreatePeopleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->integer('id')->unsigned()->autoIncrement();
            $table->string('nom', 255);
            $table->string('img', 255);
            $table->string('categoria', 255);
            $table->string('ranking', 255)->nullable()->default(NULL);
            $table->string('folder', 255)->nullable()->default(NULL);
            $table->string('ins', 255)->nullable()->default(NULL);
            $table->string('face', 255)->nullable()->default(NULL);
            $table->string('tiktok', 255)->nullable()->default(NULL);
            $table->string('youtube', 255)->nullable()->default(NULL);
            $table->string('video', 255)->nullable()->default(NULL);
            $table->string('mp3', 255)->nullable()->default(NULL);
            $table->timestamp('created_at')->nullable()->default(NULL);
            $table->timestamp('updated_at')->nullable()->default(NULL);
        });
    }
   
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('people');
    }
}
filament

migracio taula tools

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

/**
 * Migration auto-generated by TablePlus 4.10.1(202)
 * @author https://tableplus.com
 * @source https://github.com/TablePlus/tabledump
 */
class CreateToolsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tools', function (Blueprint $table) {
            $table->integer('id')->unsigned()->autoIncrement();
            $table->string('nom', 255);
            $table->text('descripcio')->nullable()->default(NULL);
            $table->longtext('body');
            $table->string('categoria', 255);
            $table->string('img', 255);
            $table->string('img1', 255)->nullable()->default(NULL);
            $table->string('img2', 255)->nullable()->default(NULL);
            $table->string('youtube', 255)->nullable()->default(NULL);
            $table->string('codi', 255)->nullable()->default(NULL);
            $table->string('slug', 255)->nullable()->default(NULL);
            $table->timestamp('created_at')->nullable()->default(NULL);
            $table->timestamp('updated_at')->nullable()->default(NULL);
            $table->string('web', 255)->nullable()->default(NULL);
        });
    }
   
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tools');
    }
}
github

Crear repositori a github i posar-hi el contingut desde HTDOCS

descripcio

git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/estudijoanpuig/estudi.git
git push -u origin master
html

enllaços html links

ds

enllaç obrir en finestra nova
<a href="url" target="_blank">titol</a>


link image dimensions
<a href="url web"><img src="url image"  width="150" height="150"></a>
html

filtre gallery uikit cards

He inclos dues variacions: 1.- uk-active que ensenya un determinat filtre.  2.- he tret el filtre a laravel subtituït per link a la seva propia gal.leria.

<ul class="uk-subnav uk-subnav-pill">
					<li data-uk-filter-control=""><a href="#">Show All</a></li>
					<li class="uk-active" data-uk-filter-control=".cap"><a href="#">cap</a></li>
					<li data-uk-filter-control=".github"><a href="#">github</a></li>
					<li data-uk-filter-control=".servidor"><a href="#">servidor</a></li>
					<li ><a href="/laravel">laravel</a></li>
					<li data-uk-filter-control=".llibreries"><a href="#">llibreries</a></li>
					<li data-uk-filter-control=".php"><a href="#">php</a></li>
					<li data-uk-filter-control=".html"><a href="#">html</a></li>
					<li data-uk-filter-control=".css"><a href="#">css</a></li>
					<li data-uk-filter-control=".voyager"><a href="#">voyager</a></li>
					<li data-uk-filter-control=".filament"><a href="#">filament</a></li>
				</ul>
laravel

Instal.lacio de Laravel ultima versio 9 amb VITE.

Aguanta tot el meu web i ha estat un gran descobriment!. Al front theme uikit kick-off amb coses de per aqui i per alla i laravel voyager al back-end, foreach a la base de dades i presentades amb datatables.

composer global require laravel/installer
laravel new projecte
laravel

Instal.lar una versio especifica de laravel en aquest cas la 8 amb WEBPACK-MIX.

Laravel és un marc d'aplicacions web amb una sintaxi expressiva i elegant. Un marc web proporciona una estructura i un punt de partida per crear la vostra aplicació, cosa que us permet centrar-vos a crear alguna cosa sorprenent mentre fem els detalls.

					 
composer create-project laravel/laravel proyecto "8.*"
					
laravel

routes laravel

al fitxer routes\web.pp

<?php

use Illuminate\Support\Facades\Route;





Route::get('/', function () {   
    return view('inici');
});

Route::get('/tools', function () {   
    return view('tools');
});

Route::get('/codis', function () {   
    return view('codis');
});

Route::get('/webs', function () {   
    return view('webs');
});




Route::group(['prefix' => 'admin'], function () {
    Voyager::routes();
});
laravel">
laravel

migration laravel tools

exemple per la creacio de la taula tools ("php artisan make:migration create_tools_table")

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateToolsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tools', function (Blueprint $table) {
           
            $table->id();
			$table->string('nom');
			$table->string('descripcio');
			$table->text('body');
			$table->string('categoria');
			$table->string('img');
			$table->string('img1');
			$table->string('img2');
			$table->string('web');
			$table->string('youtube');
			$table->string('codi');
			$table->string('slug')->unique();
            $table->timestamps();
        });
       
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tools');
    }
}
laravel

vistes i layouts en laravel (views)

Les vistes a Laravel són la part pública que l'usuari del nostre sistema podrà veure, s'escriuen en HTML juntament amb un motor de plantilles anomenat Blade . Les vistes es troben ubicades a la carpeta resources/views/


1-<!-- Stored in resources/views/layouts/app.blade.php -->
<!-- el codi html del header nav -->
@yield('content')
<!-- el codi html del footer -->


2-<!-- Stored in resources/views/pagina.blade.php -->

@extends('layouts.Appestudi')
@section('title', 'Gal.leria de webs')
@section('content')

<!-- el codi html del contingut -->


@stop
laravel

Crear un controlador (Controller)

Per crear un controlador utilitzarem les ordres d' artisan , pel nostre exemple crearem el controlador “AlumnoController”, pots fer servir l'opció –resource , aquest recurs crearà les funcions bàsiques de maneig de les sol·licituds HTTP com a funcions d'index, create, store, show, edit, update i destroy.

php artisan make:controller CodesController --resource
laravel

vistes laravel cridar foreach

vistes laravel cridar foreach

@foreach ($persons as $person)
	
	{{$person->categoria}}
	
@endforeach
	
laravel

creacio d'un middlewares per a protegir las routes.

El middleware ofereix un mecanisme convenient per inspeccionar i filtrar les sol·licituds HTTP que entren a la vostra aplicació.

Per exemple, Laravel inclou un middleware que verifica que l'usuari de la vostra aplicació està autenticat. Si l'usuari no està autenticat, el programari intermedi redirigirà l'usuari a la pantalla d'inici de sessió de l'aplicació. Tanmateix, si l'usuari s'autentica, el programari intermedi permetrà que la sol·licitud continuï més enllà de l'aplicació.

Es pot escriure programari intermediari addicional per realitzar una varietat de tasques a més de l'autenticació. Per exemple, un middleware de registre pot registrar totes les sol·licituds entrants a la vostra aplicació. Hi ha diversos middleware inclosos al marc de Laravel, inclòs middleware per a l'autenticació i la protecció CSRF. Tots aquests middleware es troben al app/Http/Middlewaredirectori.

php artisan make:middleware EnsureTokenIsValid
<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class EnsureTokenIsValid
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->input('token') !== 'my-secret-token') {
            return redirect('home');
        }
 
        return $next($request);
    }
}
laravel

creacio d'una consulta query

bases de dades en laravel-Database: query builder

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
 
class UserController extends Controller
{
    /**
     * Show a list of all of the application's users.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $users = DB::select('select * from users where active = ?', [1]);
 
        return view('user.index', ['users' => $users]);
    }
}
laravel

Artisan Console

 

Artisan és la interfície de línia d'ordres inclosa amb Laravel. Artisan existeix a l'arrel de la vostra aplicació com a artisanscript i proporciona una sèrie d'ordres útils que us poden ajudar mentre creeu la vostra aplicació. Per veure una llista de totes les ordres d'Artisan disponibles, podeu utilitzar list

php artisan list

php artisan help migrate

php artisan tinker
app\Models directori i amplien la Illuminate\Database\Eloquent\Modelclasse. Podeu utilitzar l' make:model ordre Artisan per generar un model nou:

laravel">
laravel

crear model

Generating Model Classes

Per començar, creem un model Eloqüent. Els models normalment viuen al app\Models directori i amplien la Illuminate\Database\Eloquent\Modelclasse. Podeu utilitzar l' make:model ordre Artisan per generar un model nou:

php artisan make:model Flight

php artisan make:model Flight --migration


# Generate a model and a FlightFactory class...
php artisan make:model Flight --factory
php artisan make:model Flight -f
 
# Generate a model and a FlightSeeder class...
php artisan make:model Flight --seed
php artisan make:model Flight -s
 
# Generate a model and a FlightController class...
php artisan make:model Flight --controller
php artisan make:model Flight -c
 
# Generate a model, FlightController resource class, and form request classes...
php artisan make:model Flight --controller --resource --requests
php artisan make:model Flight -crR
 
# Generate a model and a FlightPolicy class...
php artisan make:model Flight --policy
 
# Generate a model and a migration, factory, seeder, and controller...
php artisan make:model Flight -mfsc
 
# Shortcut to generate a model, migration, factory, seeder, policy, controller, and form requests...
php artisan make:model Flight --all
 
# Generate a pivot model...
php artisan make:model Member --pivot
laravel

crear un model -mcr

Amb -mcr se crearan tres nous fitxers:

Model migracio i controlador

php artisan make:model Code -mcr
laravel

crear acces directe de storage

php artisan storage:link
llibreries

datatables: taula responsive amb tailwind.

taula responsive tailwind amb datatables

<!-- Section 2 -->
<section class="h-25 bg-white"style="background-image: url('liniesobjectiu.png'); background-repeat: no-repeat;">

	
	<!--Replace with your tailwind.css once created-->
	<!--Regular Datatables CSS-->
	<link href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet">
	<!--Responsive Extension Datatables CSS-->
	<link href="https://cdn.datatables.net/responsive/2.2.3/css/responsive.dataTables.min.css" rel="stylesheet">

	<style>
		/*Overrides for Tailwind CSS */

		/*Form fields*/
		.dataTables_wrapper select,
		.dataTables_wrapper .dataTables_filter input {
			color: #4a5568;
			/*text-gray-700*/
			padding-left: 1rem;
			/*pl-4*/
			padding-right: 1rem;
			/*pl-4*/
			padding-top: .5rem;
			/*pl-2*/
			padding-bottom: .5rem;
			/*pl-2*/
			line-height: 1.25;
			/*leading-tight*/
			border-width: 2px;
			/*border-2*/
			border-radius: .25rem;
			border-color: #edf2f7;
			/*border-gray-200*/
			background-color: #edf2f7;
			/*bg-gray-200*/
		}

		/*Row Hover*/
		table.dataTable.hover tbody tr:hover,
		table.dataTable.display tbody tr:hover {
			background-color: #ebf4ff;
			/*bg-indigo-100*/
		}

		/*Pagination Buttons*/
		.dataTables_wrapper .dataTables_paginate .paginate_button {
			font-weight: 700;
			/*font-bold*/
			border-radius: .25rem;
			/*rounded*/
			border: 1px solid transparent;
			/*border border-transparent*/
		}

		/*Pagination Buttons - Current selected */
		.dataTables_wrapper .dataTables_paginate .paginate_button.current {
			color: #fff !important;
			/*text-white*/
			box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .1), 0 1px 2px 0 rgba(0, 0, 0, .06);
			/*shadow*/
			font-weight: 700;
			/*font-bold*/
			border-radius: .25rem;
			/*rounded*/
			background: #667eea !important;
			/*bg-indigo-500*/
			border: 1px solid transparent;
			/*border border-transparent*/
		}

		/*Pagination Buttons - Hover */
		.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
			color: #fff !important;
			/*text-white*/
			box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .1), 0 1px 2px 0 rgba(0, 0, 0, .06);
			/*shadow*/
			font-weight: 700;
			/*font-bold*/
			border-radius: .25rem;
			/*rounded*/
			background: #667eea !important;
			/*bg-indigo-500*/
			border: 1px solid transparent;
			/*border border-transparent*/
		}

		/*Add padding to bottom border */
		table.dataTable.no-footer {
			border-bottom: 1px solid #e2e8f0;
			/*border-b-1 border-gray-300*/
			margin-top: 0.75em;
			margin-bottom: 0.75em;
		}

		/*Change colour of responsive icon*/
		table.dataTable.dtr-inline.collapsed>tbody>tr>td:first-child:before,
		table.dataTable.dtr-inline.collapsed>tbody>tr>th:first-child:before {
			background-color: #667eea !important;
			/*bg-indigo-500*/
		}
	</style>
	<!--Container-->
	<div class="container w-full md:w-4/5 xl:w-3/5  mx-auto px-2">
 <h1 class="mb-6 text-4xl font-extrabold leading-none max-w-5xl mx-auto tracking-normal text-gray-900 sm:text-5xl md:text-5xl lg:text-5xl md:tracking-tight"> Aqui  <span class="w-full text-transparent bg-clip-text bg-gradient-to-r from-green-400 via-blue-500 to-purple-500 lg:inline">Tinc una llista de objectius</span>  que: <br class="lg:block hidden"> em fa falta ajuda per aconseguir!. </h1>
		<!--Card-->
		<div id='recipients' class="p-8 mt-6 lg:mt-0 rounded shadow bg-white">
			<table id="example" class="stripe hover" style="width:100%; padding-top: 1em;  padding-bottom: 1em;">
				<thead>
					<tr>
						<th data-priority="1">nom</th>
						<th data-priority="2">descripcio</th>						
						<th data-priority="5">Start date</th>
						<th data-priority="6">status</th>
						<th data-priority="6"> sol.lucio</th>
						<th data-priority="5">final date</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>register</td>
						<td>incorporar altres usuaris i rols per col.laboracions e inclus mes endevant suscripcions</td>						
						<td>04/08/2022</td>
						<td> <span class="uk-text-danger" uk-icon="icon: close; ratio: 3.5"></span></td>
						<td><a href="#">pendent</a></span></td>
						<td>-</td>
					</tr>

					<!-- Rest of your data (refer to https://datatables.net/examples/server_side/ for server side processing)-->

					<tr>
						<td>Administracio</td>
						<td>operacions crud per l'administrador</td>
						<td>04/08/2022</td>
						<td> <span class="uk-text-success" uk-icon="icon: check; ratio: 3.5"></span></td>
						<td><a href="#">voyager</a></span></td>
						<td>04/08/2022</td>
					</tr>
				</tbody>
			</table>
		</div>
		<!--/Card-->
	</div>
	<!--/container-->
	<!-- jQuery -->
	<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

	<!--Datatables -->
	<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
	<script src="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js"></script>
	<script>
		$(document).ready(function() {

			var table = $('#example').DataTable({
					responsive: true
				})
				.columns.adjust()
				.responsive.recalc();
		});
	</script>
</section>
php

array php

array php


					<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "estudi";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM `codes` order by categoria asc";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) { 
?> 

<!-- element que vull repetir -->
<?php echo "$row[nom]";?>

<?php }
} else {
echo "0 results";
}
$conn->close();
?> 		
servidor

configurar xampp i host virtual

descripcio

CONFIGURAR SERVIDOR VIRTUAL

1. OBRIR EL FITXER "C:\xampp\apache\conf\extra\httpd-vhosts.conf" i deixar.....


<VirtualHost *:80> 
   DocumentRoot "C:/xampp/htdocs/"
   ServerName localhost  
</VirtualHost>

<VirtualHost *:80> 
   DocumentRoot "C:/xampp/htdocs/estudijoanpuig/public/"
   ServerName estudijoanpuig  
</VirtualHost>

<VirtualHost *:80> 
   DocumentRoot "C:/xampp/htdocs/estudi/public/"
   ServerName estudi  
</VirtualHost>

<VirtualHost *:80> 
   DocumentRoot "C:/xampp/htdocs/laravel/public/"
   ServerName laravel  
</VirtualHost>




2. OBRIR EL FITXER  "C:\Windows\System32\drivers\etc\hosts" I DEIXAR COM ...

 localhost name resolution is handled within DNS itself.
	127.0.0.1       localhost
	::1             localhost
	
	127.0.0.1       estudijoanpuig
	127.0.0.1       estudi
	127.0.0.1       laravel
	


CONFIGURAR EXTENSION PHP PER A LARAVEL 
======================================
descomentar a la linia 920 del fitxer C:\xampp\php\php.ini 

extension=gd
servidor

pujar laravel a servidor compartit

Fraccionar el projecte: 1.-Pujar tota la carpeta de local al directori del domini. 2.-Agafal el directori public i posarlo a public_html. 3.-a public_html posar-hi el fitxer .htaccess. 4.-Modificar la ruta a index.php  

 

Codi del fitxer .htaccess

RewriteEngine On
RewriteCond %{REQUEST_URI} !^public
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/(?:\ Ballot169)?
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)$ public/$1 [L]





Codi de bootstrap/app

//public_path
$app->bind('path.public',function(){
   return realpath('./../public/'); 
});
voyager

afegir voyager

Voyager és un paquet d'administració de Laravel que inclou operacions BREAD (CRUD), un gestor de mitjans, un creador de menús i molt més.

composer require tcg/voyager

php artisan voyager:install --with-dummy

php artisan voyager:admin [email protected] --create
voyager

format json per al dropdown dels formularis de voyager

format json per al dropdown dels formularis de voyager

{
    "default": "tailwind",
    "options": {
        "tailwind": "tailwind",
        "bootstrap": "bootstrap",
        "uikit": "uikit"
    }
}
voyager

voyager creacio d'una taula

En el panell de control, tools\database\create new table

Inside of your admin panel you can visit Tools->Database and you'll be able to view all your current tables in your database. You may also click on 'Create a New Table' to create a new table in your database. All newly created tables will use the charset defined in your default database connection.

Aqui Tinc una llista de objectius i... em fa falta ajuda per aconseguir-los!.

nom descripcio Start date status link sol.lucio final date
Administracio panell de control per fer operacions de crud i nomes pugui entrar la persona registrada com administrador 2022-08-07 08:49:00 url solucio 2022-08-07 09:13:30
protegir una pagina a segons quins usuaris nomes se que cal fer-ho amb middleware 2022-08-07 19:51:00 url solucio 2022-08-08 10:26:13
configrar els enviaments de correu recordar contrasenya, formulari de contacte etc. 2022-08-08 19:44:00 url solucio 2022-08-08 19:47:53

© 2021 estudijoanpuig

Facebook Instagram Twitter GitHub Dribbble