Desenvolvimento de Plataforma de Leilão Online com Java e Spring Boot

Este projeto descreve a concepção e implementação de uma plataforma de leilões online, utilizando o framework Spring Cloud como base. A arquitetura do sistema adere ao modelo de três camadas (apresentação, lógica de negócios e acesso a dados), visando facilitar a manutenção através de uma estrutura baseada em navegador (B/S).

Visão Geral do Sistema

A plataforma foi desenvolvida com foco em dois perfis de usuário principais: Administrador e Usuário comum. O administrador possui um painel de controle robusto para gerenciar diversas seções do sistema, incluindo:

  • Gerenciamento de Usuários
  • Tabelas de Usuários
  • Gerenciamento de Tokens
  • Configurações Gerais do Sistema
  • Itens Colecionáveis
  • Categorias de Produtos
  • Pedidos
  • Categorias de Notícias de Leilão
  • Notícias de Leilão
  • Feedback de Mensagens
  • Produtos para Leilão
  • Fóruns de Leilão
  • Comentários de Produtos em Leilão
  • Registros de Lances em Produtos
  • Gerenciamento de Endereços
  • Seção "Sobre Nós"

O Spring Boot foi empregado para a gestão e otimização dos módulos do sistema. A aplicação backend é desenvolvida em Java, enquanto a interface do usuário e o painel administrativo utilizam tecnologias como Vue.js. O banco de dados MySQL é responsável pela persistência dos dados, incluindo informações de usuários e permissões. O servidor de aplicação Tomcat é utilizado para a depuração e execução do sistema. O ambiente de desenvolvimento integrado (IDE) IntelliJ IDEA foi escolhido para centralizar o desenvolvimento e a integração dos módulos.

Tecnologias Empregadas

  • Linguagem de Desenvolvimento: Java
  • Framework Principal: Spring Boot
  • Versão do JDK: JDK 1.8
  • Servidor de Aplicação: Tomcat 7
  • Banco de Dados: MySQL
  • Ferramenta de Banco de Dados: Navicat 11
  • IDE de Desenvolvimento: IntelliJ IDEA / Eclipse / MyEclipse
  • Gerenciamento de Dependências: Maven

Funcionalidades Principais

O sistema suporta as interações de Administrador e Usuário. O Administrador pode gerenciar amplamente o conteúdo e os usuários através do painel de controle, cobrindo funcionalidades como:

  • Gestão de contas de usuário
  • Manutenção de tabelas relacionadas a usuários
  • Administração de tokens de autenticação
  • Configuração da descrição do sistema
  • Gerenciamento de itens favoritos dos usuários
  • Organização de categorias de produtos
  • Processamento de pedidos
  • Categorização de notícias sobre leilões
  • Publicação e gestão de notícias de leilão
  • Moderação de mensagens e feedbacks
  • Administração de produtos disponíveis para leilão
  • Gerenciamento de fóruns de discussão de leilão

Exemplo de Código - Controlador de Finanças

A seguir, um trecho de código exemplificando um controlador REST para a entidade Caiwu (que pode ser interpretada como "Finanças" ou "Patrimônio" no contexto do sistema), demonstrando operações CRUD e autenticação:


package com.example.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.example.common.Result;
import com.example.common.ResultCode;
import com.example.entity.Caiwu;
import com.example.exception.CustomException;
import com.example.service.CaiwuService;
import com.example.utils.MapWrapperUtils;
import com.example.utils.jwt.JwtUtil;
import com.example.vo.CaiwuVo;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping(value = "/caiwu")
public class CaiwuController {

   @Resource
   private CaiwuService caiwuService;

   /**
    * Adiciona um novo registro financeiro.
    * @param caiwu Dados do registro financeiro a ser adicionado.
    * @return Resultado da operação.
    */
   @PostMapping
   public Result<caiwu> add(@RequestBody CaiwuVo caiwu) {
       caiwuService.add(caiwu);
       return Result.success(caiwu);
   }
	
   /**
    * Remove múltiplos registros financeiros.
    * @param caiwu Objeto contendo a lista de IDs a serem removidos.
    * @return Resultado da operação.
    */
   @PostMapping("/deleteList")
   public Result<caiwu> deleteList(@RequestBody CaiwuVo caiwu) {
       caiwuService.deleteList(caiwu.getList());
       return Result.success();
   }

   /**
    * Remove um registro financeiro pelo ID.
    * @param id ID do registro a ser removido.
    * @return Resultado da operação.
    */
   @DeleteMapping("/{id}")
   public Result delete(@PathVariable Long id) {
       caiwuService.delete(id);
       return Result.success();
   }

   /**
    * Atualiza um registro financeiro existente.
    * @param caiwu Dados atualizados do registro financeiro.
    * @return Resultado da operação.
    */
   @PutMapping
   public Result update(@RequestBody CaiwuVo caiwu) {
       caiwuService.update(caiwu);
       return Result.success();
   }

   /**
    * Obtém detalhes de um registro financeiro pelo ID.
    * @param id ID do registro a ser consultado.
    * @return Detalhes do registro financeiro.
    */
   @GetMapping("/{id}")
   public Result<caiwu> detail(@PathVariable Integer id) {
       Caiwu caiwu = caiwuService.findById(id);
       return Result.success(caiwu);
   }

   /**
    * Lista todos os registros financeiros.
    * @return Lista de todos os registros financeiros.
    */
   @GetMapping
   public Result<list>> all() {
       return Result.success(caiwuService.list());
   }

   /**
    * Busca registros financeiros paginados.
    * @param caiwuVo Critérios de paginação e filtro.
    * @return Lista paginada de registros financeiros.
    */
   @PostMapping("/page")
   public Result<caiwuvo> page(@RequestBody CaiwuVo caiwuVo) {
       return Result.success(caiwuService.findPage(caiwuVo));
   }
	
   /**
    * Autentica um usuário no sistema.
    * @param caiwu Credenciais de login (username e password).
    * @param request Requisição HTTP.
    * @return Token de autenticação e dados do usuário em caso de sucesso.
    */
   @PostMapping("/login")
   public Result login(@RequestBody Caiwu caiwu, HttpServletRequest request) {
       if (StrUtil.isBlank(caiwu.getZhanghao()) || StrUtil.isBlank(caiwu.getMima())) {
           throw new CustomException(ResultCode.PARAM_LOST_ERROR);
       }
       Caiwu authenticatedUser = caiwuService.login(caiwu);
       
       if(authenticatedUser != null) {
           HashMap<string object=""> responseMap = new HashMap<>();
           // Gerar token JWT com informações do usuário
           Map<string object=""> claims = MapWrapperUtils.builder(MapWrapperUtils.KEY_USER_ID, authenticatedUser.getId());
           String token = JwtUtil.creatToken(claims);
           
           responseMap.put("user", authenticatedUser);
           responseMap.put("token", token);
           return Result.success(responseMap);
       } else {
           // Retorna erro genérico se a autenticação falhar
           return Result.error();
       }
   }

   /**
    * Atualiza a senha de um usuário.
    * @param info Objeto contendo ID, senha antiga e nova senha.
    * @param request Requisição HTTP.
    * @return Resultado da operação.
    */
   @PutMapping("/updatePassword")
   public Result updatePassword(@RequestBody Caiwu info, HttpServletRequest request) {
       Caiwu existingCaiwu = caiwuService.findById(info.getId());
       String oldPasswordEncrypted = SecureUtil.md5(info.getMima());

       if (!oldPasswordEncrypted.equals(existingCaiwu.getMima())) {
           // Erro de senha inválida
           return Result.error(ResultCode.PARAM_PASSWORD_ERROR.code, ResultCode.PARAM_PASSWORD_ERROR.msg);
       }
       
       // Atualiza a senha com a nova senha criptografada
       info.setMima(SecureUtil.md5(info.getNewPassword()));
       Caiwu updatedCaiwu = new Caiwu();
       BeanUtils.copyProperties(info, updatedCaiwu);
       caiwuService.update(updatedCaiwu);
       
       return Result.success();
   }
}
 </string></string></caiwuvo></list></caiwu></caiwu></caiwu>

Estrutura do Banco de Dados (Esquema de Exemplo)

A estrutura do banco de dados é composta por diversas tabelas que suportam as funcionalidades do sistema, como:

  • aboutus: Informações institucionais sobre a plataforma.
  • address: Gerenciamento de endereços de entrega dos usuários.
  • auctionjingpaishangpin: Registros de lances em produtos de leilão.
  • config: Configurações gerais do sistema.
  • discussjingpaishangpin: Comentários e discussões sobre produtos em leilão.
  • ... (e outras tabelas para categorias, pedidos, notícias, etc.)

Um exemplo de script DDL para a criação do banco de dados e tabelas específicas pode ser consultado abaixo:


--
-- Banco de Dados: `springbootve7479f8`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `springbootve7479f8` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;

USE `springbootve7479f8`;

--
-- Estrutura da tabela `aboutus`
--

DROP TABLE IF EXISTS `aboutus`;
CREATE TABLE `aboutus` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Chave primária',
 `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data de criação',
 `title` varchar(200) NOT NULL COMMENT 'Título',
 `subtitle` varchar(200) DEFAULT NULL COMMENT 'Subtítulo',
 `content` longtext NOT NULL COMMENT 'Conteúdo',
 `picture1` longtext COMMENT 'Imagem 1',
 `picture2` longtext COMMENT 'Imagem 2',
 `picture3` longtext COMMENT 'Imagem 3',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Sobre nós';

--
-- Dados da tabela `aboutus`
--

INSERT INTO `aboutus` VALUES (1,'2024-02-14 12:35:19','Sobre Nós','ABOUT US','Seu texto sobre a empresa aqui...','upload/aboutus_picture1.jpg','upload/aboutus_picture2.jpg','upload/aboutus_picture3.jpg');

--
-- Estrutura da tabela `address`
--

DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Chave primária',
 `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data de criação',
 `userid` bigint(20) NOT NULL COMMENT 'ID do usuário',
 `address` varchar(200) NOT NULL COMMENT 'Endereço',
 `name` varchar(200) NOT NULL COMMENT 'Nome do destinatário',
 `phone` varchar(200) NOT NULL COMMENT 'Telefone',
 `isdefault` varchar(200) NOT NULL COMMENT 'Endereço padrão [Sim/Não]',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='Endereços';

--
-- Dados da tabela `address`
--

INSERT INTO `address` VALUES (1,'2024-02-14 12:35:19',11,'Endereço Exemplo 1','Destinatário 1','11111111111','Sim'),(2,'2024-02-14 12:35:19',12,'Endereço Exemplo 2','Destinatário 2','22222222222','Sim');

--
-- Estrutura da tabela `auctionjingpaishangpin`
--

DROP TABLE IF EXISTS `auctionjingpaishangpin`;
CREATE TABLE `auctionjingpaishangpin` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Chave primária',
 `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data de criação',
 `refid` bigint(20) NOT NULL COMMENT 'ID de referência do produto',
 `userid` bigint(20) NOT NULL COMMENT 'ID do usuário',
 `nickname` varchar(200) DEFAULT NULL COMMENT 'Nome de usuário',
 `avatarurl` longtext COMMENT 'URL do avatar',
 `auctionprice` double DEFAULT '0' COMMENT 'Preço do lance',
 `auctionstatus` varchar(200) DEFAULT NULL COMMENT 'Status do lance',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='Registro de lances em produtos';

--
-- Dados da tabela `auctionjingpaishangpin`
--

INSERT INTO `auctionjingpaishangpin` VALUES (1,'2024-02-14 13:04:02',38,1707915820925,'Usuário A','upload/avatarA.png',107.9,'Fora'),(2,'2024-02-14 13:04:25',38,12,'Usuário B','upload/avatarB.jpg',115.9,'Fora'),(3,'2024-02-14 13:04:45',38,1707915820925,'Usuário A','upload/avatarA.png',123.9,'Liderando');

--
-- Estrutura da tabela `config`
--

DROP TABLE IF EXISTS `config`;
CREATE TABLE `config` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Chave primária',
 `name` varchar(100) NOT NULL COMMENT 'Nome do parâmetro de configuração',
 `value` varchar(100) DEFAULT NULL COMMENT 'Valor do parâmetro',
 `url` varchar(500) DEFAULT NULL COMMENT 'URL associada',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='Configurações do sistema';

--
-- Dados da tabela `config`
--

INSERT INTO `config` VALUES (1,'ImagemPrincipal','upload/banner1.jpg',NULL),(2,'ImagemSecundaria','upload/banner2.jpg',NULL),(3,'ImagemTerciaria','upload/banner3.jpg',NULL);

--
-- Estrutura da tabela `discussjingpaishangpin`
--

DROP TABLE IF EXISTS `discussjingpaishangpin`;
CREATE TABLE `discussjingpaishangpin` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Chave primária',
 `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data de criação',
 `refid` bigint(20) NOT NULL COMMENT 'ID de referência do produto',
 `userid` bigint(20) NOT NULL COMMENT 'ID do usuário',
 `avatarurl` longtext COMMENT 'URL do avatar',
 `nickname` varchar(200) DEFAULT NULL COMMENT 'Nome de usuário',
 `content` longtext NOT NULL COMMENT 'Conteúdo do comentário',
 `reply` longtext COMMENT 'Conteúdo da resposta',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Comentários de produtos em leilão';
 

Tags: java Spring Boot Spring Cloud MySQL RESTful API

Publicado em 7-20 07:18