Master Web Full Stack
Master Web Full Stack
DB_CONNECTION=mysql DB_CONNECTION=pgsql
DB_HOST=127.0.0.1 DB_HOST=127.0.0.1
DB_PORT=3306 DB_PORT=5432
DB_DATABASE=[nombreBD] DB_DATABASE=[NombreDB]
DB_USERNAME=[usuario] DB_USERNAME=[username]
DB_PASSWORD=[clave] DB_PASSWORD=[Clave]
Nota: en caso de elegir trabajar con PostgreSQL es importante activar algunas
opciones del archivo php.ini del XAMPP
extension=pdo_pgsql
extension=pgsql
Se deben activar retirando el punto y coma que hay delante de ellos.
Use App\Models\[nombreModelo];
- Luego puedes crear un método para testear el ORM en el cuál hagas una
consulta a una tabla de la base de datos de la siguiente manera:
]);
if($validate->fails())
{
$datos = array(
‘status’ => ‘Error’,
‘code’ => ‘código de error’ ,
‘message’ => ‘mensaje de error’,
‘errors’ => $validate->errors()
);
}else
{
$datos = array(
‘status’ => ‘Sucess’,
‘code’ => ‘código éxito’ ,
‘message’ => ‘mensaje’
);
}
return response()->json($datos, [código]);
//Cifrar contraseñas
$pwd = hash(‘sha256’,$params->password)
//Creación del usuario.
** Recordar que es importante incluir el modelo para poder hacer
acciones con la base de datos:
use App\Models\[ModeloUsar];
//instanciamos un objeto del modelo.
$user = new User();
$user->campo = $params_array[‘datoGuardar’];
//Guardar usuario.
$user->save();
"firebase/php-jwt":"3.0.0"
(Se pueden probar otras versiones)
composer update
Creación de un HELPER
Los helpers son servicios que nos ayudan a realizar algunos procedimientos
dentro de nuestra aplicación, son solo métodos que están dentro de una clase y
que se vincularan dentro de nuestro proyecto laravel, en este caso vamos a crear
un helper que nos ayude con el control de Tokens de los usuarios que se loguean
en el sistema. Para crear un helper seguimos los siguientes pasos:
1. Creamos la carpeta Helpers dentro del directorio App, allí vamos a guardar
todos los helpers de nuestra API.
2. Dentro de Helper creamos una clase con el nombre jwtAuth.php
3. Dentro de la clase vamos a cargar los namespaces que voy a usar.
4. namespace App\Helpers;
5.
6. use Firebase\JWT\JWT;
7. use Illuminate\Support\Facades\DB;
8. use App\Models\User;
9. Creamos una clase JwtAuth y dentro de ella almacenamos los métodos que
nos ayudarán al control de Tokens. Es importante crear un constructor de la
clase jwtAuth que contenga el valor de la clave con la cuál se puede
codificar y decodificar nuestro token.
Class jwtAuth
{
Public function __construct()
{
$this->key = 'Esta_eS_miS_perCl4ve';
}
$jwt = JWT::encode($token,$this->key,'HS256');
//var_dump($jwt);die();
$decoded = JWT::decode($jwt,$this->key,['HS256']);
if(is_null($getToken))
{
$data = $jwt;
}
else
{
$data = $decoded;
}
}
else
{
$data = array(
'status' => 'Error',
'message' => 'Login Incorrecto'
);
}
return $data;
}
public function checkToken($jwt, $getIdentity = false)
{
$auth = false;
try{
$jwt = str_replace('"','',$jwt);
$decoded = JWT::decode($jwt,$this->key, ['HS256']);
}catch(\UnexpectedValueException $e){
$auth = false;
}catch(\DomainException $e){
$auth = false;
}
if(!empty($decoded) && is_object($decoded) && isset($decoded->sub))
{
$auth = true;
}
else
{
$auth = false;
}
if($getIdentity)
{
return $decoded;
}
return $auth;
}
require_once app_path().'/Helpers/JwtAuth.php';
App\Providers\JwtAuthServiceProvider::class
o Por último, añadimos un alias para que pueda ser llamado
fácilmente.
11. Para tener un control de los Tokens vamos a tener en cuenta las siguientes
capas dentro de la clase JwtAuth. Esto lo realizaremos en un método que
se llamará signup(), este método va a recibir el email, la password y un
getToken para recibir los datos de usuario y para poder validar.
public function signup($email,$password,$getToken=null)
{
//Buscar si existe el usuario con las credenciales.
$user = User::where([
‘email’=>$email,
‘password’=>$password
])->first();
If(is_null($getToken))
{
$data = $jwt;
}else
{
$data = $decoded;
}
Return $data;
12. Para que podamos utilizar este método entonces será necesario, en el
controlador de usuarios crear un método login que envíe los datos del
usuario a mi validador en el Helper.
]);
if($validate->fails()){
$signup = array(
'status'=> 'error',
'code'=> 404,
'message'=> 'El Usuario no se ha podido identificar',
'errors'=>$validate->errors(),
);
}else
{
//Cifrar la password
$pwd = hash('sha256',$params->password);
public function handle(Request $request, Closure $next)
{
//* Comprobamos que el usuario esta identificado
$token = $request->header('Authorization');
$jwtauth = new \JwtAuth();
$checkToken = $jwtauth->checkToken($token);
if($checkToken)
{
return $next($request);
}
else
{
$data = array(
'status' => 'error',
'code' => 400,
'message' => 'El usuario no se ha identificado'
);
return response()->json($data, $data['code']);
}
'api.auth' => \App\Http\Middleware\ApiAuthMiddleware::class,
//*Recibimos el archivo a subir
$image = $request->file('file0');
//* Guardamos la imagen
if($image)
{
$image_name = time().$image->getClientOriginalName();
\Storage::disk('users')->put($image_name, \File::get($image));
$data = array(
'status' => 'Sucess',
'code' => 200,
'image' => $image_name
);
}
3. Mostramos mensaje de error o éxito.
4. else
5. {
6. $data = array(
7. 'status' => 'error',
8. 'code' => 400,
9. 'message' => 'Error al subir imagen'
10. );
11. }
12. return response()->json($data, $data['code']);
Validar la imagen:
Para validar la imagen utilizamos el siguiente código dentro del método para subir
la imágen:
//*Validacion de imágen
$validate = \Validator::make($request->all(), [
'file0' => 'required|image|mimes:jpg,jpeg,png,gif'
]);
/* Guardamos la imagen
if(¡$image || $validate->fails())
{
$data = array(
'status' => 'error',
'code' => 400,
'message' => 'Error al subir imagen',
'Error' => $validate->errors()
);
}
public function getImage($filename)
{
$isset = \Storage::disk('users')->exists($filename);
if($isset)
{
//*Saco la imagen del disco y la guardo en la variable
$file = \Storage::disk('users')->get($filename);
return new Response($file,200);
}
else
{
$data = array(
'status' => 'Fallo',
'code' => 404,
'Mensaje' => 'No existe la imagen'
);
return response()->json($data, $data['code']);
}
}
public function details($id)
{
$user = User::find($id);
if(is_object($user))
{
$data = array(
'status' => 'Sucess',
'code' => 202,
'User' => $user
);
}
else
{
$data = array(
'status' => 'Error',
'code' => 404,
'Mensaje' => 'El usuario no existe'
);
}
return response()->json($data, $data['code']);
}
Frontend: Angular
Instalación de ANGULAR
1. Instalar NODE JS
2. En la ventana de comandos ejecutar:
- Instalar última versión de NPM: npm install -g npm@latest
- Borrar la cache de NODEJS: npm cache clean --force
- Desactivar las auditorias de NPM: npm set audit false
- Desinstalar versiones anteriores de Angular:
npm uninstall -g angular-cli
npm uninstall -g @angular/cli
- Borrar la cache de NODEJS: npm cache clean --force
3. Instalación de Angular CLI en la última versión
- npm install -g @angular/cli
4. Generación de nuevo proyecto ANGULAR
- ng new [nombre]
5. Instalamos dependencias
npm i bootstrap jquery -S
npm i bootstrap
npm i jquery
npm i angular-file-uploader --force
npm i angular-froala-wysiwyg
"styles": [
"src/styles.css",
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/froala-editor/css/froala_style.min.css",
"node_modules/froala-editor/css/froala_editor.pkgd.min.css"
],
"scripts": [
"node_modules/jquery/dist/jquery.min.js",
"node_modules/bootstrap/dist/js/bootstrap.min.js",
"node_modules/froala-editor/js/froala_editor.pkgd.min.js"
]
npm update
ng serve para arrancar el sv.
Creación de modelos:
Creamos algunos modelos que van a representar algunas entidades que tenemos
en nuestro Backend.
1. Creamos una carpeta en App que se llamara models.
2. Dentro de la carpeta debemos crear un modelo para cada entidad. (tabla de la
base de datos). En minúscula.
3. Luego configuramos el interior del archivo de la siguente manera: los atributos
son los campos de la base de datos.
//todos DEFINO UNA CLASE Y PERMITO QUE SE PUEDA EXPORTAR
export class user{
//*DEFINO EL CONSTRUCTOR Y CADA UNA DE LAS PROPIEDADES
constructor
(
public id: number,
public name: string,
public surname: string,
public rol: string,
public email: string,
public password: string,
public description: string,
public image: string
){}
}
Creación de los componentes:
Barra de navegación
Lo primero que vamos a hacer es borrar el contenido de app.component.html y
ponemos un navbar de los que trae Bootstrap V5 en este caso, posteriormente
vamos a encerrar todo en un contenedor principal, DIV class container.
<!-- todos CONTENEDOR PRINCIPAL -->
<div class="container">
<br>
<!-- todos BARRA DE NAVEGACION -->
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">
<img src="../assets/images/angular.png" alt="" width="30" height="24" class="d-
inline-block align-text-top">
NG-BLOG
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-
target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-
expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Inicio</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Categorias</a>
</li>
</ul>
<ul class="navbar-nav navbar-right">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
Nombre de usuario
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">crear entrada</a></li>
<li><a class="dropdown-item" href="#">crear categoria</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Mi perfil</a></li>
<li><a class="dropdown-item" href="#">Ajustes</a></li>
<li><a class="dropdown-item" href="#">Cerrar session </a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</div>
Esto nos va crear una carpeta en la cual vamos a guardar todos los componentes
y adicionalmente allí mismo se creara un componente llamado login. En el archivo
login.ts añadimos, pero antes cambiamos el nombre del selector.
public page_title: string;
constructor() {
this.page_title = 'Identificate'
Luego en la vista login.component.html podemos usar la variable page_title
<h1>{{page_title}}</h1>
Luego debo insertar mi componente para que funcione debajo del NAV en el
componente principal, lo debes llamar de la misma manera que nombras el
componente
<login></login>
//TODOS IMPORT NECESARIOS
import { ModuleWithProviders } from "@angular/core";
import { Routes, RouterModule } from "@angular/router";
//TODOS IMPORTAR COMPONENTES
import { LoginComponent } from "./components/login/login.component";
import { RegisterComponent } from "./components/register/register.component";
//TODOS DEFINIR LAS RUTAS
const appRoutes: Routes = [
{path: '',component: LoginComponent},
{path: 'inicio',component: LoginComponent},
{path: 'login',component: LoginComponent},
{path: 'register',component: RegisterComponent},
];
//TODOS EXPORTAR LAS RUTAS
export const appRoutingProviders: any[] = [];
export const routing: ModuleWithProviders<any> = RouterModule.forRoot(appRoutes);
import { routing } from './app.routing';
import { appRoutingProviders } from './app.routing';
imports: [
BrowserModule,
routing
],
providers: [
appRoutingProviders
],
Luego en el componente principal usamos: <router-outlet></router-outlet> para
que reconozca cual es la ruta a la cual estamos intentando acceder.
Crear mas componentes:
Creamos componentes para la página de inicio y errores de la misma manera en
que lo hemos venido haciendo. Los errores se deben redireccionar a (**) que
significa que la página no existe.
Crear enlaces dentro de Angular:
Reemplazar el HREF por
[routerLink]="['/register']"
import { FormsModule } from '@angular/forms';
imports: [
BrowserModule,
routing,
FormsModule
],
<div class="col-md-12 mt-3">
<h1>{{page_title}}</h1>
<p>
Registrate en nuestra plataforma para crear nuevas entradas y mucho más!!!
</p>
<!-- Todos FORMULARIO DE REGISTRO -->
<form class="col-md-5 ml-0 pl-0">
<div class="form-group">
<label for="name">Nombre</label>
<input type="text" name="name" class="form-control">
</div>
<div class="form-group">
<label for="surname">Apellidos</label>
<input type="text" name="surname" class="form-control">
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="text" name="email" class="form-control">
</div>
<div class="form-group">
<label for="password">Contraseña</label>
<input type="text" name="password" class="form-control">
</div>
<br>
<input type="submit" value="Registrarme" class="btn btn-success" />
</form>
</div>
import { User } from 'src/app/models/user';
public user: User;
Constructor:
this.user = new User(1, '','','ROLE_USER','','','','');
onSubmit(form:any)
{
console.log(this.user);
}
<div class="col-md-12 mt-3">
<h1>{{page_title}}</h1>
<p>
Registrate en nuestra plataforma para crear nuevas entradas y mucho más!!!
</p>
<!-- Todos FORMULARIO DE REGISTRO -->
<form class="col-md-5 ml-0 pl-0" #registerForm="ngForm"
(ngSubmit)="onSubmit(registerForm)">
<div class="form-group">
<label for="name">Nombre</label>
<input type="text" name="name" class="form-control" #name="ngModel"
[(ngModel)]="user.name" required pattern="[a-zA-Z]+">
<small *ngIf="!name.valid && name.touched"
class="invalid-feedback d-block">
El nombre no es valido
</small>
</div>
<div class="form-group">
<label for="surname">Apellidos</label>
<input type="text" name="surname" class="form-control" #surname="ngModel"
[(ngModel)]="user.surname" required pattern="[a-zA-Z]+">
<small *ngIf="!surname.valid && surname.touched"
class="invalid-feedback d-block">
El apellido no es valido
</small>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="text" name="email" class="form-control" #email="ngModel"
[(ngModel)]="user.email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]
{2,4}$">
<small *ngIf="!email.valid && email.touched"
class="invalid-feedback d-block">
El Email no es valido
</small>
</div>
<div class="form-group">
<label for="password">Contraseña</label>
<input type="password" name="password" class="form-control" #passwor
d="ngModel"
[(ngModel)]="user.password" required>
<small *ngIf="!password.valid && password.touched"
class="invalid-feedback d-block">
La contraseña no es valida
</small>
</div>
<br>
<input type="submit" value="Registrarme" class="btn btn-success" />
</form>
</div>
Mejorar el formulario:
Desactivar el boton de registro cuando el formulario no esta completamente lleno:
se debe agregar la siguiente directiva en el input
[disabled]=registerForm.invalid
form.reset();
import { HttpClientModule} from '@angular/common/http';
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { HttpHeaders } from "@angular/common/http";
import { Observable } from "rxjs";
import { User } from "../models/user";
@Injectable()
export class UserService
{
constructor
(
public _http: HttpClient
)
{
}
test()
{
return "Hola mundo desde un servicio!!";
}
}
console.log(this._userService.test());
export var global =
{
url: 'sitco.local/api/employee/'
}
import { global } from "./global";
3. Inicializamos la URL del API en el servicio.
public url:string;
constructor
(
public _http: HttpClient
)
{
this.url = global.url;
}
4. Creamos el método de registro en el servicio
register(employee:any): Observable<any>
{
//todos Capturo el parametro Employee y lo convierto a JSON STRING
let json = JSON.stringify(employee);
let params = 'json='+json;
//todos Defino las cabeceras
let headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-
urlencoded');
//todos Luego vamos a hacer una petición AJAX
return this._http.post(this.url+'store', params, {headers:headers});
}
onSubmit(form:any)
{
console.log(form);
this._employeeService.register(this.employee).subscribe
(
//todos 2 FUNCIONES DE CALLBACK, UNO PARA LA RESPUESTA Y OTRO PA
RA EL ERROR.
response =>{console.log(response);form.reset();},
error => {console.log(<any>error);}
);
}
Formulario de login:
En primer lugar vamos a colocar la propiedad del objeto usuario en el constructor
de login.ts, nos quedaría de la siguiente manera: Igualmente se debe crear un
atributo de tipo público a nivel de la clase.
public user: User;
this.user = new User(1, '','','ROLE_USER','','','','');
import { User } from 'src/app/models/user';
import { UserService } from 'src/app/services/user.service';
providers: [UserService]
private _userService: UserService,
<div class="col-md-12 mt-3">
<h1>{{page_title}}</h1>
<p>
Identificate en la plataforma
</p>
<form class="col-md-5 ml-0 pl-0" #loginForm="ngForm"
(ngSubmit)="onSubmit(loginForm)">
<div class="form-group">
<label for="email" >Correo electrónico</label>
<input type="text" name="email" class="form-control" #email="ngModel"
[(ngModel)]="user.email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]
{2,4}$">
<small *ngIf="!email.valid && email.touched"
class="invalid-feedback d-block">
El Email no es valido
</small>
</div>
<div class="form-group">
<label for="password">Contraseña</label>
<input type="password" name="password" class="form-control"
#password="ngModel"
[(ngModel)]="user.password" required>
<small *ngIf="!password.valid && password.touched"
class="invalid-feedback d-block">
La contraseña no es valida
</small>
</div>
<br>
<input type="submit" value="Identificarse" class="btn btn-success"
[disabled]=loginForm.invalid/>
</form>
</div>
onSubmit(form:any)
{
this._userService.signup(this.user).subscribe
(
response =>
{
//todos TOKEN
if(response.status!='error')
{
this.status = 'success';
this.token = response;
//TODOS OBJETO USUARIO IDENTIFICADO
this._userService.signup(this.user,true).subscribe
(
response =>
{
this.identity = response;
//TODOS USAR EL USUARIO IDENTIFICADO
console.log(this.token);
console.log(this.identity);
},
error =>
{
this.status = 'error';
console.log(<any>error);
}
);
}
else
{
this.status = 'error';
}
},
error =>
{
this.status = 'error';
console.log(<any>error);
}
)
}
En el servicio debemos crear un método Signup el cuál vamos a llamar para que
funcione todo el tema de login:
signup(user:any, getToken:any = null): Observable<any>
{
if(getToken != null)
{
user.getToken = 'true';
}
let json = JSON.stringify(user);
let params = 'json='+json;
let headers = new HttpHeaders().set('Content-Type','application/x-www-form-
urlencoded');
return this._http.post(this.url+'login', params, {headers:headers});
}
localStorage.setItem('token',this.token);
localStorage.setItem('identity',JSON.stringify(this.identity));
getIdentity()
{
let identity = JSON.parse(localStorage.getItem('identity')||'{}');
if(identity && identity != "undefined")
{
this.identity = identity;
}
else
{
this.identity = null;
}
return this.identity;
}
También vamos a crear el método GetToken que tendrá la misión de traer el token
del usuario identificado.
getToken()
{
let token = localStorage.getItem('token');
if(token != 'undefined')
{
this.token = token;
}
else
{
this.token = null;
}
return this.token;
}
import { UserService } from 'src/app/services/user.service';
providers: [UserService]
export class AppComponent {
public title = 'blog';
public identity:any;
public token:any;
{{identity.name + '' + identity.surname}}
*ngIf="identity && identity.name"
De la misma manera vamos a hacer para las opciones de registro y login, vamos a
poner que cuando la identidad NO exista entonces no muestre la opción de
registro y login.
*ngIf="!identity && identity.name"
Cerrar sessión
Para realizar este procedimiento vamos a realizar un pequeño truco que nos va
evitar crear un nuevo componente para cerrar la sessión. Lo primero que vamos a
hacer es crear una ruta en el approuting.ts y va quedar de la siguiente manera:
{path: 'logout/:sure',component: LoginComponent},
import { ActivatedRoute, Router } from '@angular/router';
import { Params } from '@angular/router';
logOut()
{
this._route.params.subscribe(params =>
{
let logout = +params['sure'];
if(logout == 1)
{
localStorage.removeItem('identity');
localStorage.removeItem('token');
this.identity = '';
this.token = '';
//TODOS REDIRECCION A LA PAGINA PRINCIPAL
this._router.navigate(['inicio']);
}
}
)
}
Luego en el ngOnit del login component vamos a llamar la función de logout solo
cuando le llega el parámetro sure por la URL
ngOnInit(): void
{
//TODOS SE EJECUTA Y CIERRA SOLO CUANDO LLEGA EL PARAMETRO SURE P
OR LA URL
this.logOut();
}
[routerLink]="['/logout/1']"
import { Component, OnInit, DoCheck } from '@angular/core';
export class AppComponent implements OnInit, DoCheck
this.token = this._userService.getToken();
this.identity = this._userService.getIdentity();
this.token = this._userService.getIdentity();
Se propone crear un método loaduser para no repetir tantas veces el mismo
proceso:
loadUser()
{
this.identity = this._userService.getIdentity();
this.token = this._userService.getIdentity();
}
Luego en el login component .ts vamos a hacer una redirección una vez que me
loguee
//TODOS REDIRECCION A LA PAGINA PRINCIPAL
this._router.navigate(['inicio']);
Modificación de usuario:
Para realizar este procedimiento debemos trabajar en el componente, la vista y la
ruta, procedemos en primer lugar a crear un componente que se llame useredit y
que va encargarse de contener todo el código para la edición de usuario.
ng g component components/user-edit
Posteriormente vamos a añadir la ruta en el archivo de rutas que hemos definido
para nuestro proyecto de la siguiente manera:
import { UserEditComponent } from "./components/user-edit/user-edit.component";
{path: 'ajustes',component: UserEditComponent},
Luego debo ir al menú html del app component y hacer un enlace Router Link a
una sección de angular ajustes:
[routerLink]="['/ajustes']"
Creamos la vista con el formulario de los ajustes de usuario. Podemos utilizar la
misma vista que hemos utilizado para el registro y editarla posteriomente como se
indicará a continuación, no obstante antes es importante configurar algunos
ajustas en el user-edit ts para poder continuar. Recordar definir el título de la
página
constructor()
{
this.page_title = 'Ajustes de usuario';
}
También se debe crear una propiedad de tipo usuario e instanciarla para luego
importar el modelo y poder reconocer los atributos del modelo de usuario.
public page_title:string;
public user: User;
constructor()
{
this.page_title = 'Ajustes de usuario';
this.user = new User(1, '','','ROLE_USER','','','','');
}
Para rellenar los datos de usuario vamos a utilizar el servicio de usuarios que
hemos creado y allí vamos a programar los métodos. Lo primero es importar el
servicio y cargar el provider en user edit
import { UserService } from 'src/app/services/user.service';
providers: [UserService]
Luego creamos las propiedades para el token y la identidad del usuario logueado y
pasamos por parámetro en el constructor la propiedad del servicio de usuarios,
luego vamos a capturar el token y la identidad por medio del servicio de usuarios y
luego la vamos a asignar al usuario de la clase para que rellene los datos en el
formulario.
export class UserEditComponent implements OnInit {
public page_title:string;
public user: User;
public identity;
public token;
constructor
(
private _userService: UserService
)
{
this.identity = this._userService.getIdentity();
this.token = this._userService.getToken();
this.page_title = 'Ajustes de usuario';
this.user = new User(1, '','','ROLE_USER','','','','');
this.user = this.identity;
this.user = new User
(
this.identity.sub,
this.identity.name,
this.identity.surname,
this.identity.role,
this.identity.email,
'',
this.identity.description,
this.identity.image
);
}
update(token:any, user:any)
{
let json = JSON.stringify(user);
let params = 'json='+json;
//!DEFINIMOS LAS CABECERAS
let headers = new HttpHeaders()
.set('Content-Type','application/x-www-form-urlencoded')
.set('Authorization',token);
return this._http.put(this.url+'user/update', params, {headers:headers});
}
Luego vamos a llamar el método update desde el onSubmit del formulario de
ajustes, lo hacemos de la siguiente manera:
onSubmit(form:any)
{
this._userService.update(this.token,this.user).subscribe
(
response =>
{
if(response && response.status)
{
this.status = 'success';
//Actualizar el usuario en la session
console.log(response);
if(response.actualizado.name)
{
this.user.name = response.actualizado.name;
}
if(response.actualizado.surname)
{
this.user.surname = response.actualizado.surname;
}
if(response.actualizado.email)
{
this.user.email = response.actualizado.email;
}
if(response.actualizado.description)
{
this.user.description = response.actualizado.description;
}
if(response.actualizado.image)
{
this.user.image = response.actualizado.image;
}
this.identity = this.user;
localStorage.setItem('identity',JSON.stringify(this.identity));
}
else
{
this.status = 'error';
}
console.log(response);
},
error=>
{
this.status = 'error';
console.log(<any>error);
}
);
}
Vamos a utilizar la librería del froala wysiwyg para instalar un editor de texto en el
área de modificación de la descripción. En primer lugar vamos a importar en el app
module el Froala Editor Module y los añadirmos en los import de la siguiente
manera:
import { FroalaEditorModule } from 'angular-froala-wysiwyg';
import { FroalaViewModule } from 'angular-froala-wysiwyg';
FroalaEditorModule.forRoot(),
FroalaViewModule.forRoot()
Luego en la vista del user edit debo colocar la siguiente directiva en el textarea
para poder convertirlo en un froala.
[froalaEditor] [(froalaModel)]="user.description"