Dependencias Maven
| Dependencia |
Función |
| pagehelper-spring-boot-starter |
Paginación para MyBatis |
| spring-boot-starter-thymeleaf |
Motor de plantillas |
| mybatis-spring-boot-starter |
Integración MyBatis |
| spring-boot-starter-web |
Desarrollo web |
| lombok |
Generación automática de getters/setters |
| mybatis-plus-boot-starter |
Extensiones MyBatis Plus |
| druid-spring-boot-starter |
Pool de conexiones |
| hutool-all |
Utilidades |
Configuración application.yml
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/distribucion_agua?useUnicode=true&characterEncoding=utf8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
min-idle: 5
max-active: 10
max-wait: 3000
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
pagehelper:
helper-dialect: mysql
Autenticación de Usuarios
@Service
public class AutenticacionImpl implements ServicioAutenticacion {
@Autowired
private UsuarioMapper mapeadorUsuario;
public boolean verificarCredenciales(String usuario, String clave) {
QueryWrapper<Usuario> filtro = new QueryWrapper<>();
filtro.eq("nombre_usuario", usuario);
Usuario registro = mapeadorUsuario.selectOne(filtro);
return registro != null && registro.getClave().equals(clave);
}
}
@Controller
public class ControladorAutenticacion {
@Autowired
private ServicioAutenticacion servicioAuth;
@PostMapping("/login")
public String procesarLogin(String usuario, String clave, Model modelo, HttpSession sesion) {
if(servicioAuth.verificarCredenciales(usuario, clave)) {
sesion.setAttribute("usuarioActual", usuario);
return "menuPrincipal";
} else {
modelo.addAttribute("error", "Credenciales inválidas");
return "inicio";
}
}
}
Módulo de Clientes
@Service
public class ServicioClienteImpl implements ServicioCliente {
@Autowired
private ClienteMapper mapeadorCliente;
public PageInfo<Cliente> obtenerClientes(Cliente filtro) {
QueryWrapper<Cliente> consulta = new QueryWrapper<>();
if(!filtro.getNombre().isEmpty())
consulta.like("nombre_cliente", filtro.getNombre());
return new PageInfo<>(mapeadorCliente.selectList(consulta));
}
}
Módulo de Repartidores
@Mapper
public interface RepartidorMapper extends BaseMapper<Repartidor> {
@Update("UPDATE tb_repartidor SET salario = #{salario} WHERE id = #{id}")
int actualizarSalario(@Param("id") Integer id, @Param("salario") String salario);
}
Gestión de Entregas
<select id="obtenerHistorial" resultMap="mapeoEntrega">
SELECT e.id, r.nombre, c.nombre_cliente, e.fecha_entrega, e.cantidad
FROM entregas e
JOIN clientes c ON e.cliente_id = c.id
JOIN repartidores r ON e.repartidor_id = r.id
<where>
<if test="nombreRepartidor != null">
AND r.nombre LIKE CONCAT('%', #{nombreRepartidor}, '%')
</if>
</where>
</select>
Cálculo de Salarios
<select id="calcularSalarios" resultType="com.example.dominio.Salario">
SELECT r.nombre, r.salario_base,
COALESCE(SUM(e.cantidad), 0) AS entregas,
(r.salario_base + COALESCE(SUM(e.cantidad * r.comision), 0)) AS salario_total
FROM repartidores r
LEFT JOIN entregas e ON r.id = e.repartidor_id
GROUP BY r.id
</select>