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';