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:
- O paciente agenda um horário e efetua o pagamento.
- O sistema cria automaticamente uma sessão de consulta vinculada ao agendamento.
- Ambos os usuários acessam a interface de chat, que se conecta via WebSocket para atualizações instantâneas.
- As mensagens (texto, imagem, etc.) são persistidas no banco de dados e transmitidas em tempo real.
- 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.