Modales para buscadores, en alumno aun faltan varias cosas y de administrador esta completo. Creacion de controladores. Ediciones a buscador de alumno para que no era posible mirar la lista. Control en borar usuarios como adminsitrador para cuando borran y es un usuario normal tambien borra el alumno correspondiente de tabla de alumnos.

master
vicsash 4 months ago
parent 9d8830a10e
commit 94183d4ab9

@ -1,6 +1,9 @@
package com.example.proyectofinal.configuration;
import com.example.proyectofinal.component.CustomAuth;
import com.example.proyectofinal.models.login.Rol;
import com.example.proyectofinal.repositories.login.RolRepository;
import com.example.proyectofinal.repositories.login.UserRepository;
import com.example.proyectofinal.servicios.user.UsuarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@ -18,6 +21,9 @@ public class SecurityConfig{
private JdbcTemplate jdbcTemplate;
@Autowired
private UsuarioService usuarioService;
@Autowired
private RolRepository rolService;
@Autowired
private CustomAuth customAuth;
@ -89,7 +95,21 @@ public class SecurityConfig{
// Manually insert authorities for 'ALU' role
jdbcTemplate.update("INSERT INTO rol_autoridad (fk_rol, fk_autoridad) VALUES (2, 1)"); // 'ALU' - 'READ'
jdbcTemplate.update("INSERT INTO rol_autoridad (fk_rol, fk_autoridad) VALUES (2, 2)"); // 'ALU' - 'EDIT'
createDefaultRolesAuthoritiesAndAdmin();
}
}
public void createDefaultRolesAuthoritiesAndAdmin() {
try {
if (usuarioService.findByNombreUsuario("admin").isEmpty()) {
Rol adminRole = rolService.findByName("ADMIN");
usuarioService.createUsuario("admin", "admin",
"admin@example.com",
"1234",
false, adminRole.getId());
}
} catch (Exception e) {
System.out.println("Exepcion en crearUsuarioPorDefecto: " + e.getMessage());
e.printStackTrace();
}
}
}

@ -0,0 +1,191 @@
package com.example.proyectofinal.controllers;
import com.example.proyectofinal.models.empresas.Alumno;
import com.example.proyectofinal.models.empresas.Ciclo;
import com.example.proyectofinal.models.empresas.Skill;
import com.example.proyectofinal.models.login.Usuario;
import com.example.proyectofinal.servicios.empresa.AlumnoService;
import com.example.proyectofinal.servicios.empresa.CicloService;
import com.example.proyectofinal.servicios.empresa.SkillService;
import com.example.proyectofinal.servicios.user.UsuarioService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@Controller
public class UserController {
@Autowired
private UsuarioService usuarioService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private AlumnoService alumnoService;
@Autowired
private CicloService cicloService;
@Autowired
private SkillService skillService;
@GetMapping("/admin/alta_admin_nuevo")
public String showCreateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
model.addAttribute("usuario", new Usuario()); // Add this line
return "admin/usuario/create";
}
@PostMapping("/admin/alta_admin_nuevo")
public String saveNewAdmin(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
usuario.setRol(usuarioService.getRolById(1));
if(usuarioService.getUserByLogInName(usuario.getNombreLogIn()) == null){
usuarioService.createUsuario(usuario.getNombreUsuario(), usuario.getNombreLogIn(), usuario.getEmail(), usuario.getPassword(), usuario.isLogedIn(), usuario.getRol().getId());
return "redirect:/buscador?userCreated=true";
}else {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario ya existe");
}
}
@GetMapping("/api/currentUser")
public ResponseEntity<Usuario> getCurrentUser(Authentication authentication) {
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/editar_usuario")
public String showUpdateFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/update";
}
@PostMapping("/admin/update_usuario")
public String updateUser(@ModelAttribute Usuario usuario, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(usuario.getId());
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
String password = existingUser.getPassword();
existingUser.setPassword(passwordEncoder.encode(password));
usuarioService.saveUser(usuario);
return "redirect:/buscador?userUpdated=true";
}
@GetMapping("/admin/user/{id}")
public ResponseEntity<Usuario> getUser(@PathVariable Long id) {
Usuario usuario = usuarioService.findUserById(id);
return ResponseEntity.ok(usuario);
}
@GetMapping("/admin/delete_usuario")
public String showDeleteFormAdmin(Model model, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
List<Usuario> users = usuarioService.findAll();
model.addAttribute("users", users);
model.addAttribute("usuario", new Usuario());
return "admin/usuario/delete";
}
@GetMapping("/admin/delete_usuario/{id}")
public String deleteUser(@PathVariable Long id, Authentication authentication) {
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean isAdmin = authorities.stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("ADMIN"));
if (!isAdmin) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "No tienes permisos para acceder a esta página");
}
Usuario existingUser = usuarioService.findUserById(id);
if (existingUser == null) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Este usuario no existe");
}
Usuario user = usuarioService.findUserById(id);
if(user.getRol().getId() == 2){
Alumno alumno = alumnoService.findByEmail(user.getEmail());
System.out.println("TEST DELETING ALUMNO WITH ID: " + alumno.getId()+" AND EMAIL: "+alumno.getCorreo()+" AND NAME: "+alumno.getNombre());
alumnoService.deleteById(alumno.getId());
}
usuarioService.deleteUser(id);
return "redirect:/buscador?userDeleted=true";
}
@GetMapping("/usuario/usuario_update_form")
public String showUpdateForm(Model model, Authentication authentication) {
String username = authentication.getName();
Usuario usuario = usuarioService.findByLogInName(username);
Alumno alumno = alumnoService.findByEmail(usuario.getEmail());
List<Ciclo> ciclos = cicloService.findAll();
List<Skill> skills = skillService.findAll();
model.addAttribute("skills", skills);
model.addAttribute("alumno", alumno);
model.addAttribute("ciclos", ciclos);
return "admin/alumno/update";
}
@PostMapping("/usuario/update")
public ResponseEntity<String> updateAlumno(Alumno alumno, @RequestParam("ciclo") Long ciclo, @RequestParam("skills") List<Long> skills){
try{
Ciclo cicloEntity = cicloService.findById(ciclo);
Set<Skill> skillEntities = skillService.findAllByIds(skills);
alumno.setCiclo(cicloEntity);
alumno.setSkills(skillEntities);
alumnoService.save(alumno);
return new ResponseEntity<>("El alumno fue actualizado con exito", HttpStatus.OK);
}catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

@ -4,9 +4,8 @@ import com.example.proyectofinal.models.empresas.Contacto;
import com.example.proyectofinal.models.empresas.Empresa;
import com.example.proyectofinal.models.empresas.Sector;
import com.example.proyectofinal.repositories.empresas.ContactoRepository;
import com.example.proyectofinal.servicios.implemetations.IEmpresa;
import com.example.proyectofinal.servicios.implemetations.ISector;
import jakarta.annotation.security.RolesAllowed;
import com.example.proyectofinal.servicios.implemetations.empresas.IEmpresa;
import com.example.proyectofinal.servicios.implemetations.empresas.ISector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@ -87,5 +87,7 @@ public interface AlumnoRepository extends JpaRepository<Alumno, Long> {
@Query("SELECT a FROM Alumno a WHERE lower(a.dni) LIKE %:query%")
ArrayList<Alumno> alumnosByDniCust(@Param("query") String query);
@Query("SELECT a FROM Alumno a WHERE lower(a.correo) LIKE %:query%")
Alumno findByCorreo(String query);
}

@ -8,10 +8,9 @@ import java.util.Collection;
public interface AutoridadesRepository extends JpaRepository<Autoridad, Long> {
@Query("SELECT a FROM Autoridad a WHERE a.nombre = ?1")
Autoridad findByNombre(String read);
@Query(value = "SELECT COUNT(a.id) FROM autoridad a JOIN rol_autoridad ra ON a.id = ra.fk_autoridad WHERE ra.fk_rol = ?1", nativeQuery = true)
int countAutoridadesByRolId(Long rolId);
@Query("Select a from Autoridad a where a.nombre = ?1")
Autoridad findByName(String name);
}

@ -2,7 +2,7 @@ package com.example.proyectofinal.servicios.empresa;
import com.example.proyectofinal.models.empresas.Alumno;
import com.example.proyectofinal.repositories.empresas.AlumnoRepository;
import com.example.proyectofinal.servicios.implemetations.IAlumno;
import com.example.proyectofinal.servicios.implemetations.empresas.IAlumno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;
@ -162,4 +162,9 @@ public class AlumnoService implements IAlumno{
return listEmpPrime;
}
@Override
public Alumno findByEmail(String email) {
return alumnoRepository.findByCorreo(email);
}
}

@ -3,7 +3,7 @@ package com.example.proyectofinal.servicios.empresa;
import com.example.proyectofinal.models.empresas.Ciclo;
import com.example.proyectofinal.models.empresas.Familia;
import com.example.proyectofinal.repositories.empresas.CicloRepository;
import com.example.proyectofinal.servicios.implemetations.ICiclos;
import com.example.proyectofinal.servicios.implemetations.empresas.ICiclos;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

@ -2,7 +2,7 @@ package com.example.proyectofinal.servicios.empresa;
import com.example.proyectofinal.models.empresas.Contacto;
import com.example.proyectofinal.models.empresas.Empresa;
import com.example.proyectofinal.servicios.implemetations.IContactos;
import com.example.proyectofinal.servicios.implemetations.empresas.IContactos;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

@ -4,7 +4,7 @@ import com.example.proyectofinal.models.empresas.Oferta;
import com.example.proyectofinal.models.empresas.Sucursal;
import com.example.proyectofinal.repositories.empresas.EmpressaRepository;
import com.example.proyectofinal.repositories.empresas.OfertaRepository;
import com.example.proyectofinal.servicios.implemetations.IEmpresa;
import com.example.proyectofinal.servicios.implemetations.empresas.IEmpresa;
import org.springframework.data.domain.PageImpl;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;

@ -2,7 +2,7 @@ package com.example.proyectofinal.servicios.empresa;
import com.example.proyectofinal.models.empresas.Familia;
import com.example.proyectofinal.repositories.empresas.FamiliaRepository;
import com.example.proyectofinal.servicios.implemetations.IFamilia;
import com.example.proyectofinal.servicios.implemetations.empresas.IFamilia;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

@ -4,7 +4,7 @@ import com.example.proyectofinal.models.empresas.Oferta;
import com.example.proyectofinal.models.empresas.Skill;
import com.example.proyectofinal.models.empresas.Sucursal;
import com.example.proyectofinal.repositories.empresas.OfertaRepository;
import com.example.proyectofinal.servicios.implemetations.IOferta;
import com.example.proyectofinal.servicios.implemetations.empresas.IOferta;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;

@ -4,7 +4,7 @@ import com.example.proyectofinal.models.empresas.Empresa;
import com.example.proyectofinal.models.empresas.Sector;
import com.example.proyectofinal.repositories.empresas.OfertaRepository;
import com.example.proyectofinal.repositories.empresas.SectorRepository;
import com.example.proyectofinal.servicios.implemetations.ISector;
import com.example.proyectofinal.servicios.implemetations.empresas.ISector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

@ -2,7 +2,7 @@ package com.example.proyectofinal.servicios.empresa;
import com.example.proyectofinal.models.empresas.Skill;
import com.example.proyectofinal.repositories.empresas.SkillRepository;
import com.example.proyectofinal.servicios.implemetations.ISkill;
import com.example.proyectofinal.servicios.implemetations.empresas.ISkill;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

@ -6,7 +6,7 @@ import com.example.proyectofinal.models.empresas.Sucursal;
import com.example.proyectofinal.repositories.empresas.OfertaRepository;
import com.example.proyectofinal.repositories.empresas.SkillRepository;
import com.example.proyectofinal.repositories.empresas.SucursalRepository;
import com.example.proyectofinal.servicios.implemetations.ISucursal;
import com.example.proyectofinal.servicios.implemetations.empresas.ISucursal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Alumno;
@ -26,4 +26,6 @@ public interface IAlumno extends IPagination<Alumno> {
Page<Alumno> getPage(int pageNum, int size, String sortField, String sortDir, String query, String secondaryOption);
List<Alumno> searchCustom(String querySearchBar, String query, String secondaryOption);
Alumno findByEmail(String email);
}

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Ciclo;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Contacto;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Empresa;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Familia;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Oferta;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Sector;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Skill;

@ -1,4 +1,4 @@
package com.example.proyectofinal.servicios.implemetations;
package com.example.proyectofinal.servicios.implemetations.empresas;
import com.example.proyectofinal.interfaces.IPagination;
import com.example.proyectofinal.models.empresas.Empresa;

@ -0,0 +1,14 @@
package com.example.proyectofinal.servicios.implemetations.login;
import com.example.proyectofinal.models.login.Autoridad;
import com.example.proyectofinal.models.login.Rol;
import java.util.List;
public interface IAutoridad {
List<Autoridad> findAll();
Autoridad findById(Long id);
Autoridad findByName(String name);
}

@ -0,0 +1,16 @@
package com.example.proyectofinal.servicios.implemetations.login;
import com.example.proyectofinal.models.empresas.Alumno;
import com.example.proyectofinal.models.login.Rol;
import org.springframework.data.domain.Page;
import java.util.List;
public interface IRol {
List<Rol> findAll();
Rol findById(Long id);
Rol findByName(String name);
}

@ -0,0 +1,33 @@
package com.example.proyectofinal.servicios.implemetations.login;
import com.example.proyectofinal.models.login.Rol;
import com.example.proyectofinal.models.login.Usuario;
import java.util.List;
import java.util.Optional;
public interface IUsuario {
Usuario createUsuario(String nombreUsuario, String nombreLogIn, String email, String password, boolean loged, Long rolId);
Long findRolByName(String user);
Usuario findByLogInName(String logIn);
void deleteById(Long id);
List<Usuario> findAll();
Usuario findUserById(Long id);
Optional<Usuario> findByNombreUsuario(String admin);
Rol getRolById(int i);
Usuario getUserByLogInName(String nombreLogIn);
void saveUser(Usuario usuario);
void deleteUser(Long id);
}

@ -0,0 +1,32 @@
package com.example.proyectofinal.servicios.user;
import com.example.proyectofinal.models.login.Autoridad;
import com.example.proyectofinal.repositories.login.AutoridadesRepository;
import com.example.proyectofinal.servicios.implemetations.login.IAutoridad;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AutoridadService implements IAutoridad {
@Autowired
private AutoridadesRepository autoridadRepository;
@Override
public List<Autoridad> findAll() {
return autoridadRepository.findAll();
}
@Override
public Autoridad findById(Long id) {
return autoridadRepository.findById(id).orElse(null);
}
@Override
public Autoridad findByName(String name) {
return autoridadRepository.findByName(name);
}
}

@ -1,24 +0,0 @@
package com.example.proyectofinal.servicios.user;
import com.example.proyectofinal.models.login.Autoridad;
import com.example.proyectofinal.models.login.Rol;
import com.example.proyectofinal.repositories.login.AutoridadesRepository;
import com.example.proyectofinal.repositories.login.RolRepository;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.Set;
@Service
public class RolAutoService {
@Autowired
private RolRepository rolRepository;
@Autowired
private AutoridadesRepository autoridadRepository;
}

@ -0,0 +1,31 @@
package com.example.proyectofinal.servicios.user;
import com.example.proyectofinal.models.login.Rol;
import com.example.proyectofinal.repositories.login.RolRepository;
import com.example.proyectofinal.servicios.implemetations.login.IRol;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RolService implements IRol {
@Autowired
private RolRepository rolRepository;
@Override
public List<Rol> findAll() {
return rolRepository.findAll();
}
@Override
public Rol findById(Long id) {
return rolRepository.findById(id).orElse(null);
}
@Override
public Rol findByName(String name) {
return rolRepository.findByName(name);
}
}

@ -1,12 +1,12 @@
package com.example.proyectofinal.servicios.user;
import com.example.proyectofinal.models.login.Autoridad;
import com.example.proyectofinal.models.login.Usuario;
import com.example.proyectofinal.models.login.Rol;
import com.example.proyectofinal.models.login.Usuario;
import com.example.proyectofinal.repositories.login.AutoridadesRepository;
import com.example.proyectofinal.repositories.login.UserRepository;
import com.example.proyectofinal.repositories.login.RolRepository;
import jakarta.annotation.PostConstruct;
import com.example.proyectofinal.servicios.implemetations.login.IUsuario;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -21,9 +21,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Service
public class UsuarioService {
public class UsuarioService implements IUsuario {
@Autowired
private UserRepository userRepository;
@ -64,23 +65,7 @@ public class UsuarioService {
userRepository.resetLogedIn(usuario.getId());
}
@PostConstruct
@Transactional
public void createDefaultRolesAuthoritiesAndAdmin() {
try {
if (userRepository.findByNombreUsuario("admin").isEmpty()) {
Rol adminRole = rolRepository.findByName("ADMIN");
createUsuario("admin", "admin",
"admin@example.com",
"1234",
false, adminRole.getId());
}
} catch (Exception e) {
System.out.println("Exepcion en crearUsuarioPorDefecto: " + e.getMessage());
e.printStackTrace();
}
}
@Override
public Usuario createUsuario(String nombreUsuario, String nombreLogIn, String email, String password, boolean loged, Long rolId) {
// Insert into usuario table
//System.out.println("TEST: BEFORE"+ password);
@ -111,10 +96,12 @@ public class UsuarioService {
return usuario;
}
@Override
public Long findRolByName(String user) {
return rolRepository.findRoleById(user);
}
@Override
public Usuario findByLogInName(String logIn) {
return userRepository.findByNombreUsuarioLogIn(logIn).orElse(null);
}
@ -123,6 +110,41 @@ public class UsuarioService {
userRepository.deleteById(id);
}
@Override
public List<Usuario> findAll() {
return userRepository.findAll();
}
@Override
public Usuario findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Override
public Optional<Usuario> findByNombreUsuario(String admin) {
return userRepository.findByNombreUsuario(admin);
}
@Override
public Rol getRolById(int i) {
return rolRepository.findById((long) i).orElse(null);
}
@Override
public Usuario getUserByLogInName(String nombreLogIn) {
return userRepository.findByNombreUsuario(nombreLogIn).orElse(null);
}
@Override
public void saveUser(Usuario usuario) {
userRepository.save(usuario);
}
@Override
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
public void logoutAllUsers() {
userRepository.resetAllLogedIn();
}
@ -136,4 +158,5 @@ public class UsuarioService {
}
return false;
}
}

@ -1,13 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Creacion: Empresa</title>
<title>Crear Nuevo Administrador</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<style>
form {
display: flex;
@ -48,100 +48,43 @@
}
</style>
</head>
<body>
<h1>Añadir Empresa<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<form th:action="@{/empresa/save}" method="post" enctype="multipart/form-data" th:object="${empresa}">
<!--<input type="hidden" th:field="*{id}"/>-->
<div class="p-3">
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nombre">Nombre</label>
<div class = "col-sm-9">
<input type="text" th:field="*{nombre}" required minlength="2" maxlength="128" class="form-control" id="nombre">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="cif">Cif</label>
<div class = "col-sm-9">
<input type="text" th:field="*{cif}" required pattern="^[A-HJ-NP-SUVW]{1}[0-9]{7}[0-9A-J]{1}$" title="Entra un cif valido eje W12345678" class="form-control" id="cif">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="correo">Correo</label>
<div class = "col-sm-9">
<input type="text" th:field="*{correo}" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="Entra en correo valido." class="form-control" id="correo">
</div>
<body>
<h1>Crear Aministrador</h1>
<form th:action="@{/admin/alta_admin_nuevo}" th:object="${usuario}" method="post">
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreUsuario}" id="nombreUsuario" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="telefono">Telefono</label>
<div class = "col-sm-9">
<input type="text" th:field="*{telefono}" required pattern="^\d{10}$" title="Entra un numero de telefono valido de 10 digitos" class="form-control" id="telefono">
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreLogIn">Login Name:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreLogIn}" id="nombreLogIn" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="keywords">Keywords</label>
<div class = "col-sm-9">
<input type="text" th:field="*{keywords}" required pattern="([a-zA-Z0-9]+,)*[a-zA-Z0-9]+" title="Los keywords tiene que ser separados por una ," class="form-control" id="keywords">
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="email">Email:</label>
<div class="col-sm-9">
<input type="email" th:field="*{email}" id="email" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="sector">Sector</label>
<div class = "col-sm-9">
<select th:field="*{sector.id}" class="form-control" id="sector">
<option th:each="sector : ${sectores}" th:value="${sector.id}" th:text="${sector.nombre}"></option>
</select>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="password">Password:</label>
<div class="col-sm-9">
<input type="password" th:field="*{password}" id="password" required class="form-control">
</div>
</div>
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
<div class="form-group row">
<div class="col-sm-9 offset-sm-3">
<input type="submit" value="Crear Admin" class="btn btn-primary">
</div>
</div>
</form>
<script>
function goBack() {
console.log("goBack function called");
window.history.back();
}
$(document).ready(function () {
$("form").on("submit", function (event) {
event.preventDefault();
var formData = $(this).serialize();
var sectorId = $('#sector').val();
formData += '&empresa=' + encodeURIComponent(sectorId);
$.ajax({
url: '/empresa/save',
type: 'post',
data: formData,
success: function (message) {
if(message === "La empresa fue guardado con exito") {
alert("La empresa fue guardado con exito")
window.history.go(-1); // Go back two pages
} else if(message === "Este empresa ya existe en la base de datos"){
alert("Este empresa ya existe en la base de datos");
window.history.go(-1);
}else{
alert("Error, consulata a los informaticos")
window.history.go(-1)
}
},
error: function (jqXHR) {
alert(jqXHR.responseText);
window.history.back();
}
});
});
});
</script>
</body>
</html>

@ -0,0 +1,91 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Borrar Usuario</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<style>
form {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
max-width: none;
margin: auto;
padding: 25px;
margin-top: 100px;
}
.btn {
margin-top: 25px;
margin-right: 5px;
width: 120px;
height: 40px;
font-family: Verdana;
}
form input[type="submit"], form input[type="button"] {
width: 100px;
}
form input[type="text"]{
width: 75%;
}
form label{
font-size: 20px;
margin-bottom: 10px;
font-family: Verdana, Geneva, Tahoma, sans-serif;
}
body, h1 {
margin: 0;
padding: 0;
width: 100%;
box-sizing: border-box;
}
</style>
</head>
<body>
<h1>Borrar Usuario</h1>
<form th:action="@{/admin/delete_usuario}" th:object="${usuario}" method="get">
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
<div class="col-sm-9">
<select id="userSelect">
<option th:each="user : ${users}" th:value="${user.id}" th:text="${user.nombreUsuario}"></option>
</select>
</div>
</div>
<input type="hidden" th:field="*{id}" id="userId">
<div class="form-group row">
<div class="col-sm-9 offset-sm-3">
<input type="submit" value="Borrar" class="btn btn-primary">
</div>
</div>
</form>
<script>
$('form').submit(function(event) {
event.preventDefault(); // Prevent the form from submitting normally
var userId = $('#userSelect').val();
$.ajax({
url: '/admin/delete_usuario/' + userId,
type: 'get',
success: function() {
window.location.href = "/buscador?userDeleted=true";
},
error: function(jqXHR, textStatus, errorThrown) {
console.error(textStatus, errorThrown);
}
});
});
</script>
</body>
</html>

@ -1,13 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Update: Empresa</title>
<title>Editar Usuario</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<style>
form {
display: flex;
@ -48,98 +48,81 @@
}
</style>
</head>
<body>
<h1>Editar datos de Empresa<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<form th:action="@{/empresa/update}" method="post" enctype="multipart/form-data" th:object="${empresa}">
<input type="hidden" th:field="*{id}"/>
<div class="p-3">
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nombre">Nombre</label>
<div class = "col-sm-9">
<input type="text" th:field="*{nombre}" th:value="*{nombre}" required minlength="2" maxlength="128" class="form-control" id="nombre">
</div>
<body>
<h1>Editar Usuario</h1>
<form th:action="@{/admin/update_usuario}" th:object="${usuario}" method="post">
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
<div class="col-sm-9">
<select id="userSelect">
<option th:each="user : ${users}" th:value="${user.id}" th:text="${user.nombreUsuario}"></option>
</select>
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="cif">Cif</label>
<div class = "col-sm-9">
<input type="text" th:field="*{cif}" th:value="*{cif}" required pattern="^[A-HJ-NP-SUVW]{1}[0-9]{7}[0-9A-J]{1}$" title="Entra un cif valido eje. W12345678" class="form-control" id="cif">
</div>
</div>
<input type="hidden" th:field="*{id}" id="userId">
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="correo">Correo</label>
<div class = "col-sm-9">
<input type="text" th:field="*{correo}" th:value="*{correo}" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="Entra en correo valido." class="form-control" id="correo">
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreUsuario">Username:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreUsuario}" id="nombreUsuario" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="telefono">Telefono</label>
<div class = "col-sm-9">
<input type="text" th:field="*{telefono}" th:value="*{telefono}" required pattern="^\d{10}$" title="Entra un numero de telefono valido de 10 digitos" class="form-control" id="telefono">
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nombreLogIn">Login Name:</label>
<div class="col-sm-9">
<input type="text" th:field="*{nombreLogIn}" id="nombreLogIn" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="keywords">Keywords</label>
<div class = "col-sm-9">
<input type="text" th:field="*{keywords}" th:value="*{keywords}" required pattern="([a-zA-Z0-9]+,)*[a-zA-Z0-9]+" title="Los keywords tiene que ser separados por una ," class="form-control" id="keywords">
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="email">Email:</label>
<div class="col-sm-9">
<input type="email" th:field="*{email}" id="email" required class="form-control">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="sector">Sector</label>
<div class = "col-sm-9">
<select th:field="*{sector.id}" class="form-control" id="sector">
<option th:each="sector : ${sectores}" th:value="${sector.id}" th:text="${sector.nombre}" th:selected="${sector.id == empresa.sector.id}"></option>
</select>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="password">Password:</label>
<div class="col-sm-9">
<input type="password" th:field="*{password}" id="password" required class="form-control">
</div>
</div>
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
<div class="form-group row">
<div class="col-sm-9 offset-sm-3">
<input type="submit" value="Actualizar Usuario" class="btn btn-primary">
</div>
</div>
</form>
<script>
function goBack() {
console.log("goBack function called");
window.history.back();
}
$(document).ready(function () {
$("form").on("submit", function (event) {
event.preventDefault();
var formData = $(this).serialize();
var sectorId = $('#sector').val();
formData += '&sector=' + encodeURIComponent(sectorId);
$.ajax({
url: '/empresa/update',
type: 'post',
data: formData,
success: function (message) {
if(message === "Los datos de la empresa fue renovados con exito") {
alert("Los datos de la empresa fue renovada con exito")
window.history.go(-1); // Go back two pages
}else{
alert("Error, consulata a los informaticos")
window.history.go(-1)
}
},
error: function (jqXHR) {
alert(jqXHR.responseText);
window.history.back();
}
});
});
$(document).ready(function() {
$('#userSelect').trigger('change');
});
$('#userSelect').change(function() {
var userId = $(this).val();
// Log the selected user
//console.log('User selected: ' + userId);
$.ajax({
url: '/admin/user/' + userId,
type: 'get',
success: function(user) {
$('#userId').val(user.id);
$('#nombreUsuario').val(user.nombreUsuario);
$('#nombreLogIn').val(user.nombreLogIn);
$('#email').val(user.email);
$('#password').val(user.password);
},
error: function(jqXHR, textStatus, errorThrown) {
console.error(textStatus, errorThrown);
}
});
});
</script>
</body>
</html>

@ -85,7 +85,6 @@
<i class="fas fa-user" id="user-icon"></i>
<p>Usuario</p>
</div>
<h1>PAGINA PRINCIPAL</h1>
<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a>
</div>
@ -146,10 +145,85 @@
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
if (event.target === modal) {
modal.style.display = "none";
}
}
function isValidUserId() {
// Return the fetch Promise
return fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
// Return true or false based on the user ID validity
return user.id !== null && user.id !== undefined;
});
}
function createUser() {
isValidUserId().then(isValid => {
if (isValid) {
window.location.href = "/admin/alta_admin_nuevo";
} else {
alert("Id invalido");
}
});
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userCreated = urlParams.get('userCreated');
if (userCreated === 'true') {
alert('Nuevo Usuario creado');
}
});
function editUser() {
isValidUserId().then(isValid => {
if (isValid) {
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
window.location.href = "/admin/editar_usuario"
});
} else {
alert("Id invalido");
}
});
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userUpdated = urlParams.get('userUpdated');
if (userUpdated === 'true') {
alert('Usuario actualizado correctamente');
}
});
function deleteUser() {
isValidUserId().then(isValid => {
if (isValid) {
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
window.location.href = "/admin/delete_usuario"
});
} else {
alert("Id invalido");
}
});
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userDeleted = urlParams.get('userDeleted');
if (userDeleted === 'true') {
alert('Usuario Borrado');
}
});
// Get reference to the date picker
var datePicker = document.getElementById('datePicker');

@ -50,14 +50,90 @@
#date{
margin-top: 15px;
}
#user{
position: relative;
margin-left: 50px;
padding: 0px;
background-color: #dddddd;
width: 50px; /* Adjust as needed */
height: 50px; /* Adjust as needed */
display: flex;
flex-direction: column; /* New property */
align-items: center; /* Vertically center the contents */
justify-content: center; /* Horizontally center the contents */
text-align: center; /* Center the text */
}
#user-icon {
width: 22px; /* Adjust as needed */
height: 22px; /* Adjust as needed */
}
#user p {
font-size: 10px; /* Adjust as needed */
}
#info{
position: relative;
margin-left: 50px;
padding: 0px;
background-color: #dddddd;
width: 50px; /* Adjust as needed */
height: 50px; /* Adjust as needed */
display: flex;
flex-direction: column; /* New property */
align-items: center; /* Vertically center the contents */
justify-content: center; /* Horizontally center the contents */
text-align: center; /* Center the text */
}
#info-icon {
width: 22px; /* Adjust as needed */
height: 22px; /* Adjust as needed */
}
#info p {
font-size: 10px; /* Adjust as needed */
}
.modal-content p{
background-color: antiquewhite;
}
</style>
</head>
<body >
<div class="header">
<div id="user">
<i class="fas fa-user" id="user-icon"></i>
<p>Usuario</p>
</div>
<div id="info">
<i class="fas fa-info-circle" id="info-icon"></i>
<p>Información</p>
</div>
<h1>PAGINA PRINCIPAL</h1>
<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a>
</div>
<div id="userModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<p onclick="editUser()">Editar este usuario</p>
</div>
</div>
<div id="infoModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
<p id="userInfo"></p>
<hr id="divider"> <!-- Divider -->
<p id="alumnoInfo"></p>
</div>
</div>
<div class="form-container" style="display: flex; justify-content: center; align-items: center; height: calc(100vh - 60px);">
<form action="/buscador/" method="get" id="searchForm" onsubmit="submitForm()">
<div class="search-container" id="searchContainer">
@ -68,7 +144,6 @@
<select name="searchOption" id="searchOption">
<option value="empresas">Empresa</option>
<option value="sectores">Sectores</option>
<option value="alumnos" >Alumnos</option>
<option value="ofertas">Ofertas</option>
<option value="sucursales">Sucursales</option>
<option value="skills">Skills</option>
@ -87,6 +162,144 @@
</div>
<script>
//MODAL
// Get the modal
var modal = document.getElementById("userModal");
// Get the button that opens the modal
var btn = document.getElementById("user");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks the button, open the modal
btn.onclick = function() {
modal.style.display = "block";
}
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
modal.style.display = "none";
}
// Get the modals
var userModal = document.getElementById("userModal");
var infoModal = document.getElementById("infoModal");
// Get the buttons that open the modals
var userBtn = document.getElementById("user");
var infoBtn = document.getElementById("info-icon");
// Get the <span> elements that close the modals
var userSpan = userModal.getElementsByClassName("close")[0];
var infoSpan = infoModal.getElementsByClassName("close")[0];
// When the user clicks the buttons, open the modals
userBtn.onclick = function() {
userModal.style.display = "block";
}
infoBtn.onclick = function() {
infoModal.style.display = "block";
}
// When the user clicks on <span> (x), close the modals
userSpan.onclick = function() {
userModal.style.display = "none";
}
infoSpan.onclick = function() {
infoModal.style.display = "none";
}
// When the user clicks anywhere outside of the modals, close them
window.onclick = function(event) {
if (event.target === userModal) {
userModal.style.display = "none";
}
if (event.target === infoModal) {
infoModal.style.display = "none";
}
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target === modal) {
modal.style.display = "none";
}
}
function isValidUserId() {
// Return the fetch Promise
return fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
// Return true or false based on the user ID validity
return user.id !== null && user.id !== undefined;
});
}
function editUser() {
isValidUserId().then(isValid => {
if (isValid) {
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
window.location.href = "/usuario/usuario_update_form"
});
} else {
alert("Id invalido");
}
});
}
$(document).ready(function() {
const urlParams = new URLSearchParams(window.location.search);
const userUpdated = urlParams.get('userUpdated');
if (userUpdated === 'true') {
alert('Usuario actualizado correctamente');
}
});
// Get the info icon and the info modal
var infoIcon = document.getElementById("info-icon");
var infoModal = document.getElementById("infoModal");
// When the user clicks the info icon, open the info modal
infoIcon.onclick = function() {
// Fetch the user's information from the server
fetch('/api/currentUser')
.then(response => response.json())
.then(user => {
// Populate the modal with the user's information
document.getElementById("userInfo").textContent =
"Nombre: " + user.nombre + "\n" +
"Apellido: " + user.apellido + "\n" +
"Correo: " + user.correo;
// Fetch the Alumno information from the server
fetch('/api/alumnoByEmail/' + user.correo)
.then(response => response.json())
.then(alumno => {
// Populate the modal with the Alumno's information
document.getElementById("alumnoInfo").textContent =
"Nombre: " + alumno.nombre + "\n" +
"Apellido: " + alumno.apellido + "\n" +
"Correo: " + alumno.correo;
});
// Display the modal
infoModal.style.display = "block";
});
}
// When the user clicks on <span> (x), close the modal
document.getElementsByClassName("close")[0].onclick = function() {
infoModal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target === infoModal) {
infoModal.style.display = "none";
}
}
// Get reference to the date picker
var datePicker = document.getElementById('datePicker');
@ -123,6 +336,15 @@
var searchBar = document.querySelector('input[name="query"]');
var secondaryDropdown = document.getElementById('secondaryDropdown');
primaryDropdown.addEventListener('change', function() {
if (primaryDropdown.value === 'YourCondition') { // replace 'YourCondition' with the actual condition
secondaryDropdown.style.display = 'none';
} else {
secondaryDropdown.style.display = 'block';
}
});
secondaryDropdown.addEventListener('change', function() {
var datePicker = document.getElementById('datePicker');
if (['Fecha antes', 'Fecha despues', 'Año'].includes(secondaryDropdown.value)) {
@ -239,11 +461,6 @@
// Reset the form
document.querySelector('form').reset();
// Get reference to the search bar
var secondaryDropdown = document.getElementById('secondaryDropdown');
secondaryDropdown.value = 'Todo';
var searchBar = document.querySelector('input[name="query"]');
// Set the value of the search bar to "Todo" and disable it
searchBar.value = 'Todo';
searchBar.disabled = true;

@ -1,203 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Update: Alumno</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" th:href="@{/top.css}">
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>
<style>
form {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
max-width: none;
margin: auto;
padding: 25px;
margin-top: 100px;
}
.btn {
margin-top: 25px;
margin-right: 5px;
width: 120px;
height: 40px;
font-family: Verdana;
}
form input[type="submit"], form input[type="button"] {
width: 100px;
}
form input[type="text"]{
width: 75%;
}
form label{
font-size: 20px;
margin-bottom: 10px;
font-family: Verdana, Geneva, Tahoma, sans-serif;
}
body, h1 {
margin: 0;
padding: 0;
width: 100%;
box-sizing: border-box;
}
</style>
</head>
<body>
<h1>Editar datos de Alumno<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<form th:action="@{/alumno/update}" method="post" enctype="multipart/form-data" th:object="${alumno}">
<input type="hidden" th:field="*{id}"/>
<div class="p-3">
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nombre">Nombre</label>
<div class = "col-sm-9">
<input type="text" th:field="*{nombre}" required minlength="2" maxlength="75" class="form-control" id="nombre">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="cif">Apellido</label>
<div class = "col-sm-9">
<input type="text" th:field="*{apellido}" required minlength="2" maxlength="75" title="Entra un nombre" class="form-control" id="cif">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="apellido2">Apellido2</label>
<div class = "col-sm-9">
<input type="text" th:field="*{apellido2}" minlength="2" maxlength="75" class="form-control" id="apellido2">
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="fechaNacimiento">Fecha de Nacimiento</label>
<div class = "col-sm-9">
<input type="date" th:field="*{fechaNacimiento}" required class="form-control" id="fechaNacimiento" title="Introduce fecha">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="genero">Genero</label>
<div class="col-sm-9">
<select th:field="*{genero}" class="form-control" id="genero" required>
<option value="">Selecciona un genero</option>
<option value="Mujer">Mujer</option>
<option value="Varon">Varon</option>
</select>
</div>
</div>
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nia">Nia</label>
<div class = "col-sm-9">
<!--TODO: Añadir validacion de nia-->
<input type="text" th:field="*{nia}" title="Entra un nia correcto" class="form-control" id="nia">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="dni">DNI/NIE</label>
<div class="col-sm-9">
<input type="text" th:field="*{dni}" required class="form-control" id="dni" title="Introduce DNI/NIE">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="correo">Correo</label>
<div class="col-sm-9">
<input type="email" th:field="*{correo}" required class="form-control" id="correo" title="Introduce correo">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="correo2">Correo2</label>
<div class="col-sm-9">
<input type="email" th:field="*{correo2}" class="form-control" id="correo2" title="Introduce correo alternativo">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="nacionalidad">Nacionalidad</label>
<div class="col-sm-9">
<input type="text" th:field="*{nacionalidad}" class="form-control" id="nacionalidad" title="Introduce nacionalidad">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="keywords">Keywords</label>
<div class="col-sm-9">
<input type="text" th:field="*{keywords}" class="form-control" id="keywords" title="Introduce keywords">
</div>
</div>
<!-- Ciclos -->
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="ciclo">Ciclo</label>
<div class="col-sm-9">
<select th:field="*{ciclo.id}" class="form-control" id="ciclo">
<option th:each="ciclo : ${ciclos}" th:value="${ciclo.id}" th:text="${ciclo.nombre}"></option>
</select>
</div>
</div>
<div class="skills-container">
<h2>Select Skills</h2>
<select id="skills" multiple>
<option th:each="skill : ${skills}" th:value="${skill.id}" th:text="${skill.nombre}" th:selected="${alumno.skills.contains(skill)}"></option>
</select>
</div>
<div class="text-center">
<input type="submit" value="Guardar" class="btn"/>
<input type="button" value="Cancelar" id="btnCancelar" class="btn" onclick="goBack()"/>
</div>
</div>
</form>
<script>
$(document).ready(function() {
$('#skills').select2();
});
function goBack() {
window.history.back();
}
$(document).ready(function () {
$("form").on("submit", function (event) {
event.preventDefault();
var formDataArray = $(this).serializeArray();
formDataArray.push({name: 'ciclo', value: $('#ciclo').val()});
formDataArray.push({name: 'skills', value: $('#skills').val()});
$.ajax({
url: '/alumno/update',
type: 'post',
data: $.param(formDataArray),
success: function (message) {
if(message === "El alumno fue actualizado con exito") {
alert("El alumno fue actualizado con exito")
window.history.go(-1);
} else {
alert("Error, consulte a los informaticos")
window.history.go(-1)
}
},
error: function (jqXHR) {
alert(jqXHR.responseText);
window.history.back();
}
});
});
});
</script>
</body>
</html>

@ -2,7 +2,7 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Creacion: Alumno</title>
<title>Update: Alumno</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
@ -51,9 +51,10 @@
</style>
</head>
<body>
<h1>Añadir Alumno<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<h1>Editar datos de Alumno<a href="/logout" class="logout-button"><i class="fas fa-door-open"></i></a></h1>
<form th:action="@{/contacto/save}" method="post" enctype="multipart/form-data" th:object="${alumno}">
<form th:action="@{/alumno/update}" method="post" enctype="multipart/form-data" th:object="${alumno}">
<input type="hidden" th:field="*{id}"/>
<div class="p-3">
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nombre">Nombre</label>
@ -97,7 +98,6 @@
<div class ="form-group row">
<label class="col-sm-3 col-form-label" for="nia">Nia</label>
<div class = "col-sm-9">
<!--TODO: Añadir validacion de nia-->
<input type="text" th:field="*{nia}" required minlength="8" maxlength="8" title="Entra un nia correcto" class="form-control" id="nia">
</div>
</div>
@ -112,14 +112,14 @@
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="correo">Correo</label>
<div class="col-sm-9">
<input type="email" th:field="*{correo}" required minlength="5" maxlength="100" class="form-control" id="correo" title="Introduce correo">
<input type="email" th:field="*{correo}" required minlength="5" maxlength="100" class="form-control" id="correo" title="Introduce correo">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label" for="correo2">Correo2</label>
<div class="col-sm-9">
<input type="email" th:field="*{correo2}" required minlength="5" maxlength="100" class="form-control" id="correo2" title="Introduce correo alternativo">
<input type="email" th:field="*{correo2}" required minlength="5" maxlength="100"class="form-control" id="correo2" title="Introduce correo alternativo">
</div>
</div>
@ -150,7 +150,7 @@
<div class="skills-container">
<h2>Select Skills</h2>
<select id="skills" multiple>
<option th:each="skill : ${skills}" th:value="${skill.id}" th:text="${skill.nombre}"></option>
<option th:each="skill : ${skills}" th:value="${skill.id}" th:text="${skill.nombre}" th:selected="${alumno.skills.contains(skill)}"></option>
</select>
</div>
@ -160,6 +160,7 @@
</div>
</div>
</form>
<script>
$(document).ready(function() {
$('#skills').select2();
@ -177,17 +178,14 @@
formDataArray.push({name: 'skills', value: $('#skills').val()});
$.ajax({
url: '/alumno/save',
url: '/usuario/update',
type: 'post',
data: $.param(formDataArray),
success: function (message) {
if(message === "El alumno fue guardado con exito") {
alert("El alumno fue guardado con exito")
window.history.go(-1);
} else if(message === "El alumno ya existe"){
alert("El alumno ya existe");
if(message === "El alumno fue actualizado con exito") {
alert("Usuario acualizado con exito")
window.history.go(-1);
}else{
} else {
alert("Error, consulte a los informaticos")
window.history.go(-1)
}
@ -199,7 +197,6 @@
});
});
});
</script>
</body>
</html>
Loading…
Cancel
Save

Powered by INFORMATICA.FP.EDU.ES.