Sistema de Atendimento Médico Online com Spring Boot e Vue

Visão Geral do Sistema

Este projeto consiste na criação de uma plataforma de telemedicina simplificada, voltada para um Trabalho de Graduação. O objetivo é permitir que pacientes realizem consultas remotas por meio de uma aplicação web moderna, utilizando uma arquitetura de frontend e backend desacoplada. A solução foca nas funcionalidades essenciais para garantir a viabilidade técnica e a completude do projeto.

Principais Funcionalidades

  • Consulta Online Multimodal: Suporte a comunicação por texto, imagem e áudio em tempo real (WebSocket). Integração com um modelo de IA (DeepSeek) para triagem inicial via streaming (SSE).
  • Agendamento e Pagamento: Sistema para visualização de horários disponíveis, agendamento de consultas e processamento de pagamentos usando a API Sandbox do Alipay.
  • Gestão de Conteúdo (CMS): Gerenciamento administrativo de banners promocionais, médicos em destaque e artigos de saúde.
  • Receituário Digital: Módulo para que médicos emitam prescrições após uma consulta, com visualização detalhada pelo paciente.
  • Gestão de Usuários e Acesso: Sistema de autenticação e autorização baseado em funções (Paciente, Médico, Administrador) usando Sa-Token.

Stack Tecnológico

Frontend

  • Framework: Vue.js 3 com Vite
  • Gerenciamento de Estado: Pinia
  • Roteamento: Vue Router
  • Biblioteca de Componentes: Element Plus
  • Comunicação em Tempo Real: WebSocket e EventSource

Backend

  • Framework Principal: Spring Boot 3.x
  • Arquitetura: Multi-módulo Maven (core, service, admin)
  • Acesso a Dados: MyBatis-Flex
  • Segurança e Autorização: Sa-Token
  • Integrações: API do DeepSeek, SDK Alipay Sandbox

Banco de Dados

  • Relacional: MySQL 8.0
  • Cache: Redis

Design do Banco de Dados (Tabelas Principais)

A estrutura de dados segue um modelo normalizado para suportar os fluxos de negócio. Abaixo, um esboço simplificado das entidades centrais.

-- Usuários unificados com perfis específicos
CREATE TABLE system_users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    login_name VARCHAR(50) UNIQUE NOT NULL,
    encrypted_password VARCHAR(255) NOT NULL,
    user_category ENUM('ADMIN', 'DOCTOR', 'PATIENT'),
    full_name VARCHAR(100),
    avatar_link VARCHAR(255),
    contact_phone VARCHAR(20),
    account_status TINYINT DEFAULT 1,
    creation_timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Perfil estendido para médicos
CREATE TABLE doctor_details (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_ref_id BIGINT NOT NULL,
    department_code VARCHAR(20),
    professional_title VARCHAR(50),
    expertise_tags JSON,
    biography TEXT,
    consultation_fee DECIMAL(10,2),
    average_rating DECIMAL(3,2),
    FOREIGN KEY (user_ref_id) REFERENCES system_users(id)
);

-- Gerenciamento de agendas
CREATE TABLE doctor_availability (
    slot_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    doctor_ref_id BIGINT NOT NULL,
    schedule_date DATE NOT NULL,
    period_start TIME NOT NULL,
    period_end TIME NOT NULL,
    max_appointments INT,
    current_appointments INT DEFAULT 0,
    availability_status ENUM('OPEN', 'CLOSED', 'CANCELLED'),
    version_number INT DEFAULT 0,
    FOREIGN KEY (doctor_ref_id) REFERENCES system_users(id)
);

-- Transações de consulta
CREATE TABLE consultation_sessions (
    session_uuid VARCHAR(36) PRIMARY KEY,
    patient_ref_id BIGINT NOT NULL,
    doctor_ref_id BIGINT NOT NULL,
    related_booking_id BIGINT,
    session_type ENUM('AI_ASSISTED', 'HUMAN_CONSULT'),
    session_state ENUM('PENDING', 'ACTIVE', 'COMPLETED', 'CANCELED'),
    start_moment DATETIME,
    end_moment DATETIME,
    FOREIGN KEY (patient_ref_id) REFERENCES system_users(id),
    FOREIGN KEY (doctor_ref_id) REFERENCES system_users(id)
);

-- Registros de mensagem
CREATE TABLE chat_messages (
    message_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    session_ref_id VARCHAR(36) NOT NULL,
    sender_user_id BIGINT NOT NULL,
    message_format ENUM('TEXT', 'IMAGE', 'AUDIO', 'FILE', 'SYSTEM'),
    message_content TEXT,
    dispatch_time DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
    FOREIGN KEY (session_ref_id) REFERENCES consultation_sessions(session_uuid)
);

-- Pagamentos integrados
CREATE TABLE financial_transactions (
    transaction_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    initiating_user_id BIGINT,
    business_entity_id BIGINT,
    entity_type VARCHAR(50),
    transaction_amount DECIMAL(12,2),
    payment_gateway VARCHAR(20),
    transaction_state VARCHAR(20),
    gateway_reference VARCHAR(100),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Fluxo Principal: Consulta por Chat

O ciclo de vida de uma consulta entre paciente e médico segue estas etapas:

  1. O paciente agenda um horário e efetua o pagamento.
  2. O sistema cria automaticamente uma sessão de consulta vinculada ao agendamento.
  3. Ambos os usuários acessam a interface de chat, que se conecta via WebSocket para atualizações instantâneas.
  4. As mensagens (texto, imagem, etc.) são persistidas no banco de dados e transmitidas em tempo real.
  5. Ao final, o médico registra um diagnóstico e a sessão é encerrada.

Controle de Acesso e Segurança

O sistema emprega uma abordagme baseada em atributos (ABAC) simplificada com o Sa-Token. As permissões são concedidas através de papéis associados a menus e operações específicas na interface.

-- Exemplo de configuração de permissão para uma funcionalidade
INSERT INTO sys_menu (menu_name, permission_code, menu_type)
VALUES ('Gerenciar Prescrições', 'medical.prescription.manage', 'BUTTON');

-- Conceder acesso a um papel
INSERT INTO sys_role_permission (role_id, permission_id)
VALUES (2, LAST_INSERT_ID()); -- Concedendo ao papel 'MÉDICO'

Integração com Gateway de Pagamento

A integração com o Alipay Sandbox segue um padrão assíncrono. O backend gera a solicitação de pagamento, o frontend direciona o usuário para o gateway, e um endpoint de callback é definido para receber a confirmação da transação. A segurança das notificações é garantida por verificação de assinatura.

Tags: Spring Boot Vue.js MySQL WebSocket Sa-Token

Publicado em 6-12 16:59 por Thomas