Descrição Geral
Com o rápido avanço das tecnologias digitais, plataformas sociais evoluíram como ferramentas essenciais para ampliação de relacionametnos e busca de perfis compatíveis. Diferentemente das plataformas tradicionais focadas em entretenimento, este sistema propõe uma solução especializada em segmentação por interesses profissionais e afinidades específicas. A arquitetura emprega algoritmos de matching inteligente e sistema de categorização de interesses, entregando uma experiência de networking otimizada tanto para indivíduos quanto para organizações em processos de recrutamento e formação de equipes.
A implementação adota uma stack tecnológica composta por SpringBoot para o backend, Vue.js como framework frontend, MyBatis para mapeamento objeto-relacional e MySQL como sistema gerenciador de banco de dados. Os módulos principais incluem: gestão de usuários, engine de compatibilidade, publicação de conteúdos, notificações em tempo real e análise comportamental. O design RESTful das APIs garante escalabilidade e interoperabilidade com outros sistemas corporativos.
Estrutura do Banco de Dados
Tabela de Perfis de Usuários
Armazena dados cadastrais e preferências de interação. O campo perfil_id serve como identificador único, com data de registro gerada automaticamente. A estrutura inclui campos para caracterização demográfica e metadados de interesses.
| Campo | Tipo | Descrição |
|---|---|---|
| perfil_id | BIGINT | Identificador único do usuário |
| apelido | VARCHAR(50) | Nome de exibição |
| senha_hash | VARCHAR(100) | Credencial criptografada |
| VARCHAR(100) | Endereço eletrônico | |
| genero | TINYINT | Classificação (1-M, 2-F, 3-Outros) |
| data_nascimento | DATE | Data de nascimento |
| interesses | TEXT | Tags categorizadas (formato JSON) |
| data_registro | DATETIME | Momento de cadastro |
| ultimo_acesso | DATETIME | Data do login mais recente |
Tabela de Publicações Dinâmicas
Registra conteúdo gerado pelos usuários, com timestamps automáticos e visibilidade configurável. O campo publicacao_id identifica unicamente cada postagem.
| Campo | Tipo | Descrição |
|---|---|---|
| publicacao_id | BIGINT | Identificador único da publicação |
| autor_id | BIGINT | Referência ao usuário autor |
| conteudo | TEXT | Texto da publicação |
| midias | TEXT | Links de arquivos (formato JSON) |
| curtidas | INT | Total de interações positivas |
| comentarios | INT | Quantidade de respostas |
| data_publicacao | DATETIME | Momento de postagem |
| visibilidade | TINYINT | Configuração (1-Público, 2-Privado) |
Tabela de Relacionamentos
Gerencia conexões entre perfis, registrando status e histórico de interações. O campo conexao_id identifica cada relação individual.
| Campo | Tipo | Descrição |
|---|---|---|
| conexao_id | BIGINT | Identificador único da relação |
| solicitante | BIGINT | ID do perfil que iniciou a conexão |
| destino | BIGINT | ID do perfil convidado |
| status | TINYINT | Estado da relação (1-Pendente, 2-Ativa) |
| data_inicio | DATETIME | Data de estabelecimento |
| ultima_interacao | DATETIME | Data da interação mais recente |
Arquitetura Tecnológica
Backend: SpringBoot
O framework SpringBoot impleemnta a lógica de negócios com abordagem de configuração automática, reduzindo a necessidade de XMLs. Características principais:
- Inicialização zero-config: Mecanismos de autoconfiguração integrados
- Servidor embutido: Suporte a Tomcat/Jetty/Undertow
- Monitoramento: Componente Actuator para métricas e saúde do sistema
- Integração distribuída: Compatibilidade com ecossistema Spring Cloud
O modelo de dependências "starter" permite concentração no core da aplicação, enquanto o formato JAR único simplifica deploy e operação.
Frontend: Vue.js
O Vue.js oferece uma arquitetura reativa e modular para interfaces dinâmicas, com estas vantagens:
- Sistema reativo: Atualização eficiente de interfaces via tracking de dependências
- Componentização: Estrutura encapsulada com template, estilo e lógica
- Adaptabilidade: Escalabilidade de pequenas aplicações a SPAs completas
- Ecosistema rico: Vue Router, Vuex/Pinia e ferramentas CLI integradas
A sintaxe intuitiva combinada com suporte a TypeScript e ferramentas de desenvolvimento oferece robustez para projetos complexos.
Código Exemplo
package br.com.sistema;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan("br.com.sistema.persistencia")
public class Aplicacao extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Aplicacao.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Aplicacao.class);
}
}
package br.com.sistema.controle;
import java.util.Map;
import java.util.HashMap;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import br.com.sistema.modelo.Usuario;
import br.com.sistema.servico.UsuarioServico;
import br.com.sistema.util.R;
import br.com.sistema.util.PageUtils;
import br.com.sistema.util.MPUtil;
@RestController
@RequestMapping("/usuario")
public class UsuarioControle {
@Autowired
private UsuarioServico usuarioServico;
@PostMapping("/login")
public R autenticar(@RequestParam String login, @RequestParam String senha) {
Wrapper<Usuario> filtro = new EntityWrapper<>();
filtro.eq("login", login).eq("senha", senha);
Usuario usuario = usuarioServico.selectOne(filtro);
if (usuario == null) {
return R.erro("Credenciais inválidas");
}
String token = GeradorToken.criar(usuario.getId(), login);
return R.sucesso().adicionar("token", token);
}
@PostMapping("/registro")
public R cadastrar(@RequestBody Usuario usuario) {
if (usuarioServico.existeLogin(usuario.getLogin())) {
return R.erro("Login já cadastrado");
}
usuario.setId(System.currentTimeMillis());
usuarioServico.insert(usuario);
return R.sucesso();
}
@GetMapping("/lista")
public R listar(@RequestParam Map<String, Object> parametros) {
EntityWrapper<Usuario> filtro = new EntityWrapper<>();
PageUtils pagina = usuarioServico.paginar(parametros,
MPUtil.ordenar(MPUtil.filtrar(filtro, parametros), parametros));
return R.sucesso().adicionar("dados", pagina);
}
@GetMapping("/detalhe/{id}")
public R detalhar(@PathVariable Long id) {
Usuario usuario = usuarioServico.selectById(id);
return R.sucesso().adicionar("dados", usuario);
}
@PostMapping("/atualizar")
@Transactional
public R atualizar(@RequestBody Usuario usuario) {
if (usuarioServico.existeOutroLogin(usuario.getId(), usuario.getLogin())) {
return R.erro("Login já em uso");
}
usuarioServico.updateById(usuario);
return R.sucesso();
}
@PostMapping("/excluir")
public R excluir(@RequestBody Long[] ids) {
usuarioServico.deleteBatchIds(Arrays.asList(ids));
return R.sucesso();
}
}