Introdução ao Sistema
Este sistema de gerenciamento de logística foi desenvolvido para atender às necessidades atuais do gerenciamento logístico, partindo das demandas práticas do dia a dia. O sistema analisa as limitações dos sistemas tradicionais e aproveita as vantagens da computação, utilizando o framework SSM (Spring, SpringMVC, MyBatis), uma das soluções mais populares em JSP, juntamente com o editor MyEclipse e banco de dados MySQL.
O sistema implementa diversas funcionalidades essenciais para o gerenciamento logístico, incluindo módulos de gerenciamento de usuários, informações de motoristas, gestão de veículos, controle de estoque de mercadorias, gestão de entrada de produtos, autenticação de acesso e outros componentes integrados. A implementação permite a informatização e networking das operações logísticas, otimizando o uso dos recursos de dados e reduzindo significativamente os custos operacionais.
Especificações Técnicas
- Linguagem de Programação: Java
- Framework: SSM (Spring, SpringMVC, MyBatis)
- Versão JDK: JDK1.8
- Servidor: Tomcat7
- Banco de Dados: MySQL
- Ferramenta de Banco de Dados: Navicat11
- Ambiente de Desenvolvimento: Eclipse/MyEclipse/IntelliJ IDEA
- Gestão de Dependências: Maven
Módulos Funcionais
O sistema foi projetado para abordar os problemas existentes e atender às necessidades específicas através de uma abordagem digitalizada e informatizada. Os principais módulos funcionais incluem:
Gerenciamento de Usuários
- Autenticação de Administradores: Permite o acesso ao sistema para gerenciar todos os outros módulos.
- Autenticação de Usuários: Facilita o login para consulta de informações pessoais e operação das funcionalidades disponíveis.
- Cadastro de Usuários: Permite que novos visitantes se registrem no sistema, com feedback sobre o sucesso do registro.
- Adição de Administradores: Possibilita a inclusão de novos gestores, com distinção entre administradores comuns e superadministradores.
Gestão de Veículos
- Listagem de Veículos: Apresenta os veículos cadastrados em formato de tabela para os administradores.
- Cadastro de Veículos: Implementa a funcionalidade de adicionar novos veículos ao sistema com todas as informações necessárias.
- Atualização de Veículos: Permite modificar as informações dos veículos já cadastrados no sistema.
Controle de Estoque
- Visualização de Estoque: Exibe a lista completa de mercadorias em estoque.
Gestão de Entrada de Mercadorias
- Registro de Entradas: Mostra todas as entradas de mercadorias no sistema, com opção de pesquisa por palavras-chave.
- Exclusão de Registros: Permite remover entradas incorretas ou desatualizadas do sistema.
Gestão de Saída de Mercadorias
- Registro de Saídas: Exibe todas as saídas de mercadorias, com funcionalidade de busca por palavras-chave.
- Exclusão de Registros: Facilita a remoção de registros de saída incorretos ou obsoletos.
Perfil do Usuário
- Gestão de Perfil: Usuários podem visualizar e gerenciar suas informações pessoais.
- Notificações do Sistema: Permite aos usuários visualizarem mensagens e alertas do sistema.
- Atualiazção de Dados: Funcionalidade para modificar informações da conta e senha.
- Pesquisa de Informações: Busca interna no sistema através de palavras-chave.
- Alteração de Senha: Possibilidade de atualizar a senha de acesso.
Administração do Sistema
- Backup de Dados: Funcionalidade para realização de cópias de segurança do sistema.
Saída do Sistema
- Logout de Administradores: Finalização segura da sessão administrativa.
- Logout de Usuários: Encerramento seguro da sessão do usuário.
Implementação Principal
A seguir, apresentamos um trecho do código-fonte que demonstra a implementação do controlador principal do sistema:
package com.logistica.controller;
import org.springframework.util.StringUtils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.logistica.dto.RespostaDTO;
import com.logistica.enums.CodigoResposta;
import com.logistica.model.Usuario;
import com.logistica.exception.SistemaException;
import com.logistica.service.UsuarioService;
import com.logistica.util.MapeadorUtil;
import com.logistica.security.TokenUtil;
import com.logistica.vo.UsuarioVO;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/api/usuarios")
public class UsuarioController {
@Resource
private UsuarioService usuarioService;
@PostMapping
public RespostaDTO<Usuario> adicionar(@RequestBody UsuarioVO usuarioVO) {
usuarioService.adicionar(usuarioVO);
return RespostaDTO.sucesso(usuarioVO);
}
@PostMapping("/removerVarios")
public RespostaDTO<Usuario> removerVarios(@RequestBody UsuarioVO usuarioVO) {
usuarioService.removerVarios(usuarioVO.getIds());
return RespostaDTO.sucesso();
}
@DeleteMapping("/{id}")
public RespostaDTO remover(@PathVariable Long id) {
usuarioService.remover(id);
return RespostaDTO.sucesso();
}
@PutMapping
public RespostaDTO atualizar(@RequestBody UsuarioVO usuarioVO) {
usuarioService.atualizar(usuarioVO);
return RespostaDTO.sucesso();
}
@GetMapping("/{id}")
public RespostaDTO<Usuario> detalhar(@PathVariable Integer id) {
Usuario usuario = usuarioService.buscarPorId(id);
return RespostaDTO.sucesso(usuario);
}
@GetMapping
public RespostaDTO<List<Usuario>> listarTodos() {
return RespostaDTO.sucesso(usuarioService.listarTodos());
}
@PostMapping("/paginar")
public RespostaDTO<UsuarioVO> paginar(@RequestBody UsuarioVO usuarioVO) {
return RespostaDTO.sucesso(usuarioService.buscarPagina(usuarioVO));
}
@PostMapping("/autenticar")
public RespostaDTO autenticar(@RequestBody Usuario usuario, HttpServletRequest requisicao) {
if (!StringUtils.hasText(usuario.getLogin()) || !StringUtils.hasText(usuario.getSenha())) {
throw new SistemaException(CodigoResposta.PARAMETRO_AUSENTE);
}
Usuario usuarioAutenticado = usuarioService.autenticar(usuario);
if(usuarioAutenticado != null) {
Map<String, Object> dadosResposta = new java.util.HashMap<>();
dadosResposta.put("usuario", usuarioAutenticado);
Map<String, Object> dadosToken = MapeadorUtil.criarMapa(MapeadorUtil.CHAVE_USUARIO_ID, usuario.getId());
String token = TokenUtil.gerarToken(dadosToken);
dadosResposta.put("token", token);
return RespostaDTO.sucesso(dadosResposta);
} else {
return RespostaDTO.erro();
}
}
@PutMapping("/atualizarSenha")
public RespostaDTO atualizarSenha(@RequestBody Usuario dados, HttpServletRequest requisicao) {
Usuario usuario = usuarioService.buscarPorId(dados.getId());
BCryptPasswordEncoder codificador = new BCryptPasswordEncoder();
if (!codificador.matches(dados.getSenhaAtual(), usuario.getSenha())) {
return RespostaDTO.erro(CodigoResposta.SENHA_INVALIDA.codigo, CodigoResposta.SENHA_INVALIDA.mensagem);
}
dados.setSenha(codificador.encode(dados.getNovaSenha()));
Usuario usuarioAtualizado = new Usuario();
BeanUtils.copyProperties(dados, usuarioAtualizado);
usuarioService.atualizar(usuarioAtualizado);
return RespostaDTO.sucesso();
}
}
Estrutura do Banco de Dados
O sistema utiliza MySQL como banco de dados principal. A seguir, apresentamos um exemplo da estrutura das tabelas:
SET FOREIGN_KEY_CHECKS=0;
-- Estrutura da tabela `usuarios`
DROP TABLE IF EXISTS `usuarios`;
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(50) DEFAULT NULL,
`senha` varchar(100) DEFAULT NULL,
`perfil` varchar(50) DEFAULT 'OPERADOR',
`data_criacao` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
-- Estrutura da tabela `armazens`
DROP TABLE IF EXISTS `armazens`;
CREATE TABLE `armazens` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) DEFAULT NULL,
`localizacao` varchar(100) DEFAULT NULL,
`data_criacao` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
-- Estrutura da tabela `veiculos`
DROP TABLE IF EXISTS `veiculos`;
CREATE TABLE `veiculos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`codigo` varchar(50) DEFAULT NULL,
`descricao` varchar(50) DEFAULT NULL,
`placa` varchar(20) DEFAULT NULL,
`imagem` varchar(100) DEFAULT NULL,
`status` varchar(20) DEFAULT NULL,
`data_criacao` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
-- Estrutura da tabela `saidas`
DROP TABLE IF EXISTS `saidas`;
CREATE TABLE `saidas` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`codigo_produto` varchar(50) DEFAULT NULL,
`nome_produto` varchar(50) DEFAULT NULL,
`quantidade_estoque` int(11) DEFAULT NULL,
`data_saida` date DEFAULT NULL,
`quantidade_saida` int(11) DEFAULT NULL,
`data_criacao` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
Sumário da Documentação
- Introdução
- Contexto de Desenvolvimento
- Relevância do Projeto
- Escopo do Estudo
- Tecnologias e Ferramentas Utilizadas
- Framework SSM
- Framework Spring
- SpringMVC
- MyBatis
- Banco de Dados MySQL
- Tecnologia JSP
- Framework SSM
- Análise do Sistema
- Análise de Viabilidade
- Viabilidade Econômica
- Viabilidade Técnica
- Viabilidade Operacional
- Análise de Requisitos
- Análise do Fluxo de Entrada de Mercadorias
- Análise do Fluxo de Dados
- Análise de Viabilidade
- Projeto do Sistema
- Arquitetura do Sistema
- Design dos Módulos Funcionais
- Projeto do Banco de Dados
- Visão Geral do Projeto de Dados
- Modelagem Conceitual
- Estrutura das Tabelas
- Implementação do Sistema
- Objetivos Principais
- Implementação do Módulo de Autenticação
- Tela Principal
- Autenticação do Administrador
- Implementação do Módulo Administrativo
- Gestão de Usuários
- Gestão de Veículos
- Controle de Estoque
- Gestão de Entradas
- Gestão de Saídas
- Testes do Sistema
- Objetivos dos Testes
- Visão Geral dos Testes
- Testes Unitários
- Testes de Inclusão
- Testes de Autenticação
- Testes de Integração
- Conclusões
- Agradecimentos
- Referências Bibliográficas