Skip to content

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📰 NewsDrop - Sistema de Publicação de Notícias

Status PHP License

Site de publicação de notícias com editorial integrado.
🌐 Website: newsdrop.net.br


📋 Índice


✨ Características

  • 📝 Sistema Editorial Completo - Criar, editar e publicar notícias
  • 👥 Autores/Colunistas - Gestão de múltiplos autores
  • 📊 Analytics - Rastreamento de visualizações e compartilhamentos
  • 🔍 Busca - Sistema de busca de notícias inteligente
  • 📱 Responsivo - Design mobile-first
  • 🔐 Autenticação - Login seguro com sessões
  • 🌐 Compartilhamento Social - Twitter, Facebook, LinkedIn, WhatsApp
  • 📧 Newsletter - Inscrição de leitores
  • 🎯 Categorização - Organização por categorias

🔧 Requisitos

Server

  • PHP: 8.0 ou superior
  • Banco de Dados: MySQL 5.7+ ou MariaDB 10.2+
  • Servidor Web: Apache 2.4+ ou Nginx 1.20+

Client

  • Navegador moderno (Chrome, Firefox, Safari, Edge)
  • JavaScript habilitado
  • Cookies habilitados (para sessões)

Extensões PHP Necessárias

php-pdo
php-pdo-mysql
php-curl
php-fileinfo

📦 Instalação

1. Clonar Repositório

git clone https://github.com/seu-usuario/newsdrop.git
cd newsdrop

2. Configurar Banco de Dados

Opção A: XAMPP (Recomendado para Produção)

# Iniciar MySQL no XAMPP
# 1. Abrir XAMPP Control Panel
# 2. Clicar "Start" em MySQL (porta 33306)

# Importar banco existente via phpMyAdmin
# http://localhost/phpmyadmin
# - Criar database: vini5607_noticias
# - Importar arquivo SQL gerado do backup

Opção B: PHP Built-in Server (Desenvolvimento)

# Apenas para testes rápidos (sem XAMPP)
# MySQL precisa estar rodando em XAMPP
php -S localhost:8000

3. Configurar Conexão

Editar conexao.php:

<?php
// XAMPP Local (Porta 33306)
$host = 'localhost:33306';
$db = 'vini5607_noticias';
$user = 'root';
$pass = '';  // Sem senha no XAMPP
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$conn = new PDO($dsn, $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
?>

4. Configurar Permissões

# Linux/Mac
chmod 755 tmp_sessions/
chmod -R 755 imagems/

# Windows (PowerShell - Se necessário)
icacls "tmp_sessions" /grant:r Users:(F)
icacls "imagems" /grant:r Users:(F)

5. Testar Instalação

Local (PHP Server):

php -S localhost:8000
# Abrir: http://localhost:8000

Production (XAMPP/Apache):

1. Copiar projeto para: C:\xampp\htdocs\newsdrop
2. Abrir: http://localhost/newsdrop

📁 Estrutura do Projeto

newsdrop/
├── index.php                      # Página inicial
├── login.php                      # Login de autores
├── logout.php                     # Logout
├── noticia.php                    # Página individual de notícia
├── busca.php                      # Busca de notícias
├── portifolio.php                 # Galeria de autores
├── recuperar_senha.php            # Recuperação de acesso
├── inscricao_colunistas.php       # Inscrição de novos autores
│
├── processa_*.php                 # Processamento de formulários
│   ├── processa_inscricao.php     # Inscrição
│   ├── processa_newsletter.php    # Newsletter
│   └── processa_estatisticas.php  # Analytics (AJAX)
│
├── conexao.php                    # Conexão com banco de dados
│
├── css/                           # Estilos
│   ├── style.css                 # Estilos principais
│   └── responsive.css            # Media queries
│
├── js/                            # Scripts
│   └── script.js                 # JavaScript principal
│
├── imagems/                       # Imagens do site
│   ├── biblioteca.avif           # Assets principais
│   └── thumbnails/               # Cache de miniaturas
│
├── painel/                        # Painel Editorial (admin)
│   ├── dashboard2.php            # Dashboard principal
│   ├── nova-noticia.php          # Criar notícia
│   ├── editar-noticia.php        # Editar notícia
│   ├── ver-noticias.php          # Listar notícias
│   ├── editar-autor.php          # Perfil do autor
│   ├── estatisticas.php          # Analytics
│   ├── compartilhar.php          # Modal de compartilhamento
│   ├── busca.php                 # Busca interna
│   ├── noticia.php               # Preview de notícia
│   ├── salvar-noticia.php        # Salvar criação
│   ├── salvar_edicao.php         # Salvar edição
│   └── conexao.php               # Conexão local
│
├── tmp_sessions/                 # Arquivos de sessão (não commitar)
│
├── .gitignore                     # Git ignore
├── .gitattributes                # Configuração de line endings
│
├── ANALISE_PROJETO.md            # Análise de arquivos
├── MAPA_DEPENDENCIAS.md          # Mapa de dependências
├── LIMPEZA_SCRIPT.md             # Script de limpeza
└── README.md                      # Este arquivo

🎯 Funcionalidades

Para Visitantes

Funcionalidade Endpoint Descrição
Listar Notícias index.php Homepage com ultimas 12 notícias
Ver Notícia noticia.php?id=X Página individual
Buscar busca.php?q=termo Buscar por título/conteúdo
Compartilhar Modal JS Twitter, Facebook, LinkedIn, WhatsApp
Newsletter index.php Form de inscrição na newsletter
Inscrição inscricao_colunistas.php Formulário de inscrição colunista

Para Autores (Logados)

Funcionalidade Endpoint Descrição
Dashboard painel/dashboard2.php Visão geral de notícias
Criar painel/nova-noticia.php Criar nova notícia
Editar painel/editar-noticia.php?id=X Editar existente
Publicar painel/salvar-noticia.php Salvar rascunho/publicar
Listar painel/ver-noticias.php Todas as notícias do autor
Analytics painel/estatisticas.php Visualizações, compartilhamentos
Perfil painel/editar-autor.php Editar dados do autor

🔌 APIs

AJAX - Registrar Estatísticas

// Visualização
fetch('processa_estatisticas.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body: 'acao=registrar_visualizacao&id_noticia=1'
});

// Compartilhamento
fetch('processa_estatisticas.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body: 'acao=registrar_compartilhamento&id_noticia=1&rede_social=twitter'
});

// Tempo de Leitura
fetch('processa_estatisticas.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body: 'acao=registrar_tempo_leitura&id_noticia=1&tempo=120'
});

Endpoints de Processamento

Endpoint Método Parâmetros Descrição
processa_inscricao.php POST nome, email, tratamento, experiencia, biografia Inscrição colunista
processa_newsletter.php POST nome, email Inscrição newsletter
processa_estatisticas.php POST acao, id_noticia, [rede_social], [tempo] Registrar ações

🔒 Segurança

Implementado

  • ✅ Hash de senhas com password_hash()
  • ✅ Prepared statements contra SQL injection
  • ✅ Sessão com token de CSRF
  • ✅ Sanitização de entrada com filter_input()
  • ✅ Proteção de upload de imagem

Recomendações

⚠️ TODO:

  • Implementar reCAPTCHA em formulários públicos
  • Adicionar rate limiting em login
  • Implementar 2FA opcional
  • Adicionar HTTPS enforcement
  • Implementar CSP headers
  • Adicionar validação de origem (CORS)

📝 Banco de Dados

Tabelas Principais

-- Autores/Colunistas
CREATE TABLE autor (
    Id_autor INT PRIMARY KEY AUTO_INCREMENT,
    Nome_autor VARCHAR(255) NOT NULL UNIQUE,
    Email VARCHAR(255) NOT NULL UNIQUE,
    Senha_hash VARCHAR(255) NOT NULL,
    Tratamento VARCHAR(50),
    Foto_autor VARCHAR(255),
    Biografia TEXT,
    Status_autor ENUM('ativo', 'inativo') DEFAULT 'ativo',
    Data_criacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Notícias
CREATE TABLE noticia (
    Id_noticia INT PRIMARY KEY AUTO_INCREMENT,
    Id_autor INT NOT NULL,
    Titulo VARCHAR(255) NOT NULL,
    Subtitulo VARCHAR(255),
    Conteudo LONGTEXT NOT NULL,
    Imagem_url VARCHAR(255),
    id_categoria INT NOT NULL,
    Id_subcategoria INT,
    Status_noticia ENUM('rascunho', 'publicado') DEFAULT 'rascunho',
    Data_publicacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    Data_atualizacao TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (Id_autor) REFERENCES autor(Id_autor),
    FOREIGN KEY (id_categoria) REFERENCES categoria(Id_categoria)
);

-- Categorias
CREATE TABLE categoria (
    Id_categoria INT PRIMARY KEY AUTO_INCREMENT,
    Nome_categoria VARCHAR(100) NOT NULL UNIQUE,
    Descricao TEXT,
    Status_categoria ENUM('ativo', 'inativo') DEFAULT 'ativo'
);

-- Estatísticas
CREATE TABLE estatisticas (
    Id_stat INT PRIMARY KEY AUTO_INCREMENT,
    Id_noticia INT NOT NULL,
    Tipo_evento ENUM('visualizacao', 'compartilhamento', 'tempo_leitura') NOT NULL,
    Rede_social VARCHAR(50),
    Usuario_ip VARCHAR(45),
    Tempo_leitura INT,
    Data_evento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (Id_noticia) REFERENCES noticia(Id_noticia)
);

🚀 Deployment

Hospedagem Recomendada

  • ✅ Hospedagem Atual: HostGator/PHP Compartilhado
  • ✅ RAM: 2GB+ recomendado
  • ✅ Espaço: 10GB+
  • ✅ Banda: 50GB+ mensal

Deploy Steps

  1. FTP/SFTP para host
  2. Subir arquivos (exceto em .gitignore)
  3. Importar banco de dados
  4. Configurar conexao.php
  5. Testar todas as funcionalidades
  6. Configurar HTTPS
  7. Monitorar error_log

🧪 Troubleshooting

Problema: "Failed opening required 'conexao.php'"

Solução:

// Verificar caminho relativo
require_once '../conexao.php';  // Do painel
require_once './conexao.php';   // Da raiz

Problema: Sessão não persiste

Solução:

  1. Verificar tmp_sessions/ existe e é gravável
  2. Verificar session.save_path em php.ini
  3. Limpar cookies do navegador

Problema: Upload de imagem falha

Solução:

  1. Verificar permissões de imagems/ (755)
  2. Verificar upload_max_filesize em php.ini
  3. Verificar post_max_size em php.ini

Problema: Banco de dados não conecta

Solução:

  1. Verificar credenciais em conexao.php
  2. Verificar se database existe
  3. Verificar permissões do usuário MySQL

🤝 Contribuindo

  1. Fork o projeto
  2. Criar branch (git checkout -b feature/AmazingFeature)
  3. Commit mudanças (git commit -m 'Add AmazingFeature')
  4. Push para branch (git push origin feature/AmazingFeature)
  5. Abrir Pull Request

📄 Licença

Este projeto está sob a licença MIT. Ver arquivo LICENSE para mais detalhes.


👤 Autor

NewsDrop


📞 Suporte

Para suporte, abrir issue no GitHub ou contatar via email.


Última atualização: 3 de março de 2026

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages