Initial commit
This commit is contained in:
+484
@@ -0,0 +1,484 @@
|
||||
# Fluxo de Provas - Course Platform
|
||||
|
||||
Este documento explica como funciona o fluxo completo de provas no sistema, desde a criação até a realização e repetição.
|
||||
|
||||
## Visão Geral
|
||||
|
||||
O sistema de provas funciona em 4 etapas principais:
|
||||
|
||||
1. **Criação de Templates** - Professor/Admin cria modelos de prova reutilizáveis
|
||||
2. **Atribuição de Prova** - Professor/Admin atribui um template a uma turma
|
||||
3. **Realização pelo Aluno** - Aluno faz a prova dentro do período designado
|
||||
4. **Correção e Resultados** - Professor corrige e aluno vê os resultados
|
||||
|
||||
---
|
||||
|
||||
## 1. Criação de Templates de Prova
|
||||
|
||||
**Quem pode criar:** Professor ou Admin
|
||||
|
||||
**Local:** `/admin/dashboard/exam-templates` ou `/dashboard/teacher/exam-templates`
|
||||
|
||||
**O que é um Template:**
|
||||
- Um modelo de prova reutilizável com questões
|
||||
- Pode ser usado em múltiplas turmas
|
||||
- Contém:
|
||||
- Título da prova
|
||||
- Descrição
|
||||
- Instruções
|
||||
- Lista de questões (múltipla escolha ou texto)
|
||||
- Pontuação por questão
|
||||
- Tempo limite (opcional)
|
||||
|
||||
**Campos do Template:**
|
||||
```javascript
|
||||
{
|
||||
title: "Prova de Inglês - Unidade 1",
|
||||
description: "Avaliação sobre verbos e vocabulário",
|
||||
instructions: "Leia atentamente cada questão antes de responder",
|
||||
questions: [
|
||||
{
|
||||
questionText: "Qual é o passado de 'go'?",
|
||||
questionType: "multiple_choice",
|
||||
options: [
|
||||
{ optionText: "goed", isCorrect: false },
|
||||
{ optionText: "went", isCorrect: true },
|
||||
{ optionText: "gone", isCorrect: false }
|
||||
],
|
||||
points: 10,
|
||||
order: 1
|
||||
}
|
||||
],
|
||||
timeLimit: 30, // em minutos
|
||||
totalPoints: 100
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Atribuição de Prova
|
||||
|
||||
**Quem pode atribuir:** Professor ou Admin
|
||||
|
||||
**Local:** `/admin/dashboard/assignments` ou `/dashboard/teacher/assignments`
|
||||
|
||||
**O que é uma Atribuição (Assignment):**
|
||||
- Vincula um template de prova a uma turma específica
|
||||
- Define quando e como a prova pode ser realizada
|
||||
- Configura regras de tentativas e repetição
|
||||
|
||||
**Campos da Atribuição:**
|
||||
|
||||
| Campo | Descrição | Exemplo |
|
||||
|--------|-------------|----------|
|
||||
| `classId` | Turma que receberá a prova | ID da turma |
|
||||
| `examTemplateId` | Template de prova a ser usado | ID do template |
|
||||
| `title` | Título da prova (pode ser diferente do template) | "Prova 1 - Turma A" |
|
||||
| `description` | Descrição adicional | "Avaliação mensal" |
|
||||
| `instructions` | Instruções específicas | "Sem consulta" |
|
||||
| `startDate` | Data/hora de início da disponibilidade | 2025-02-01T08:00 |
|
||||
| `endDate` | Data/hora de fim da disponibilidade | 2025-02-01T18:00 |
|
||||
| `timeLimit` | Tempo limite para fazer a prova (minutos) | 30 |
|
||||
| `allowRetakes` | Permite refazer a prova | true/false |
|
||||
| `maxAttempts` | Número máximo de tentativas | 3 |
|
||||
| `showResultsAfterGrading` | Mostra resultados após correção | true/false |
|
||||
| `status` | Status da prova | "active", "draft", "archived" |
|
||||
| `useCustomQuestions` | Usa questões customizadas (não do template) | true/false |
|
||||
| `customQuestions` | Lista de questões customizadas | [...] |
|
||||
|
||||
### Configurações de Tentativas e Repetição
|
||||
|
||||
**allowRetakes (Permitir Refazer):**
|
||||
- `true`: Aluno pode fazer a prova mais de uma vez
|
||||
- `false`: Aluno só pode fazer uma vez
|
||||
|
||||
**maxAttempts (Máximo de Tentativas):**
|
||||
- Define quantas vezes o aluno pode tentar
|
||||
- Exemplo: `3` = aluno pode tentar até 3 vezes
|
||||
- Se `allowRetakes` for `false`, deve ser `1`
|
||||
|
||||
**Exemplo de Configuração:**
|
||||
|
||||
```javascript
|
||||
// Prova com 3 tentativas permitidas
|
||||
{
|
||||
allowRetakes: true,
|
||||
maxAttempts: 3,
|
||||
timeLimit: 30,
|
||||
startDate: "2025-02-01T08:00:00",
|
||||
endDate: "2025-02-01T18:00:00"
|
||||
}
|
||||
```
|
||||
|
||||
**Fluxo com Repetição:**
|
||||
1. Aluno faz a 1ª tentativa → Envia → Resultado: 60/100
|
||||
2. Aluno clica em "Fazer Prova" novamente
|
||||
3. Sistema verifica: `tentativas < maxAttempts`? → Sim
|
||||
4. Sistema cria 2ª tentativa → Aluno faz → Envia → Resultado: 80/100
|
||||
5. Aluno clica em "Fazer Prova" novamente
|
||||
6. Sistema verifica: `tentativas < maxAttempts`? → Sim
|
||||
7. Sistema cria 3ª tentativa → Aluno faz → Envia → Resultado: 90/100
|
||||
8. Aluno clica em "Fazer Prova" novamente
|
||||
9. Sistema verifica: `tentativas < maxAttempts`? → Não (3 = 3)
|
||||
10. Sistema bloqueia: "Maximum attempts (3) reached"
|
||||
|
||||
---
|
||||
|
||||
## 3. Visualização pelo Aluno
|
||||
|
||||
**Local:** `/dashboard/student/class/[classId]`
|
||||
|
||||
**Status da Prova:**
|
||||
|
||||
| Status | Descrição | Cor |
|
||||
|--------|-------------|------|
|
||||
| `upcoming` | Prova ainda não começou | Azul |
|
||||
| `available` | Prova está disponível para fazer | Verde |
|
||||
| `expired` | Prova já encerrou | Vermelho |
|
||||
|
||||
**Status da Tentativa:**
|
||||
|
||||
| Status | Descrição |
|
||||
|--------|-------------|
|
||||
| `not_started` | Aluno ainda não iniciou nenhuma tentativa |
|
||||
| `in_progress` | Aluno está fazendo a prova agora |
|
||||
| `completed` | Aluno completou a prova |
|
||||
|
||||
**O que o aluno vê:**
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Prova de Inglês - Unidade 1 │
|
||||
│ [Disponível] │
|
||||
│ │
|
||||
│ Início: 01/02/2025 08:00 │
|
||||
│ Fim: 01/02/2025 18:00 │
|
||||
│ Tempo: 30 min │
|
||||
│ Questões: 10 │
|
||||
│ Pontos: 100 │
|
||||
│ │
|
||||
│ Melhor nota: 90/100 (90%) │
|
||||
│ │
|
||||
│ [Fazer Prova] [Ver Resultados] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Início da Prova
|
||||
|
||||
**Ação:** Aluno clica em "Fazer Prova"
|
||||
|
||||
**Verificações do Sistema:**
|
||||
|
||||
1. **Verifica Período de Disponibilidade:**
|
||||
```javascript
|
||||
const now = new Date();
|
||||
if (now < assignment.startDate) {
|
||||
return "Prova ainda não começou";
|
||||
}
|
||||
if (now > assignment.endDate) {
|
||||
return "Prova já encerrou";
|
||||
}
|
||||
```
|
||||
|
||||
2. **Verifica Tentativas em Andamento:**
|
||||
```javascript
|
||||
const inProgressAttempt = attempts.find(a => a.status === "in_progress");
|
||||
if (inProgressAttempt) {
|
||||
return "Continuar prova em andamento";
|
||||
}
|
||||
```
|
||||
|
||||
3. **Verifica Máximo de Tentativas:**
|
||||
```javascript
|
||||
const existingAttempts = await ExamAttempt.countDocuments({
|
||||
assignmentId: assignmentId,
|
||||
studentId: studentId,
|
||||
});
|
||||
|
||||
if (existingAttempts >= assignment.maxAttempts) {
|
||||
return `Maximum attempts (${assignment.maxAttempts}) reached`;
|
||||
}
|
||||
```
|
||||
|
||||
**Se todas as verificações passarem:**
|
||||
- Sistema cria uma nova `ExamAttempt`
|
||||
- Status: `"in_progress"`
|
||||
- `attemptNumber`: `existingAttempts + 1`
|
||||
- `startedAt`: Data/hora atual
|
||||
- Redireciona para a página de realização da prova
|
||||
|
||||
---
|
||||
|
||||
## 5. Realização da Prova
|
||||
|
||||
**Local:** `/dashboard/student/assignments/[assignmentId]/take`
|
||||
|
||||
**O que acontece:**
|
||||
|
||||
1. **Carregamento das Questões:**
|
||||
- Se `useCustomQuestions` for `true`: usa `assignment.customQuestions`
|
||||
- Se `useCustomQuestions` for `false`: usa `template.questions`
|
||||
|
||||
2. **Contador de Tempo:**
|
||||
- Se `timeLimit` estiver definido, inicia contador
|
||||
- Atualiza a cada segundo
|
||||
- Se tempo acabar, envia automaticamente
|
||||
|
||||
3. **Respostas do Aluno:**
|
||||
- Sistema salva as respostas temporariamente
|
||||
- Aluno pode mudar as respostas antes de enviar
|
||||
- Não há salvamento automático (deve ser implementado)
|
||||
|
||||
**Estrutura das Respostas:**
|
||||
```javascript
|
||||
{
|
||||
questionId1: { type: "mc", value: "optionId1" },
|
||||
questionId2: { type: "text", value: "Resposta do aluno" },
|
||||
questionId3: { type: "mc", value: null } // não respondida
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Envio da Prova
|
||||
|
||||
**Ação:** Aluno clica em "Enviar" ou tempo acaba
|
||||
|
||||
**Validações:**
|
||||
1. Confirmação do aluno (se não for auto-submit)
|
||||
2. Validação das respostas
|
||||
|
||||
**Processo de Envio:**
|
||||
```javascript
|
||||
// 1. Usa as mesmas questões que foram exibidas
|
||||
const examQuestions = assignment.useCustomQuestions
|
||||
? assignment.customQuestions
|
||||
: template.questions;
|
||||
|
||||
// 2. Mapeia as respostas do aluno
|
||||
const answers = examQuestions.map((q) => {
|
||||
const answer = currentAnswers[q._id] || { type: "mc", value: null };
|
||||
return {
|
||||
questionId: q._id,
|
||||
selectedOptionId: answer.type === "mc" ? answer.value : null,
|
||||
textAnswer: answer.type === "text" ? answer.value : null,
|
||||
};
|
||||
});
|
||||
|
||||
// 3. Envia para o servidor
|
||||
const result = await submitExamAttempt(attempt._id, answers);
|
||||
```
|
||||
|
||||
**Após Envio:**
|
||||
- Status da tentativa: `"submitted"`
|
||||
- Redireciona para `/dashboard/student/assignments/[assignmentId]/results`
|
||||
|
||||
---
|
||||
|
||||
## 7. Visualização de Resultados
|
||||
|
||||
**Local:** `/dashboard/student/assignments/[assignmentId]/results`
|
||||
|
||||
**O que o aluno vê:**
|
||||
|
||||
1. **Se `showResultsAfterGrading` for `true`:**
|
||||
- Mostra todas as tentativas
|
||||
- Mostra a nota de cada tentativa
|
||||
- Mostra a melhor nota
|
||||
- Mostra as respostas corretas
|
||||
|
||||
2. **Se `showResultsAfterGrading` for `false`:**
|
||||
- Mostra mensagem: "Sua prova foi enviada e aguarda correção pelo professor"
|
||||
- Botão para refazer (se permitido)
|
||||
|
||||
**Exemplo de Visualização:**
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Prova de Inglês - Unidade 1 │
|
||||
│ │
|
||||
│ Suas Tentativas: │
|
||||
│ │
|
||||
│ 1. 60/100 (60%) - 01/02/2025 │
|
||||
│ 2. 80/100 (80%) - 01/02/2025 │
|
||||
│ 3. 90/100 (90%) - 01/02/2025 │
|
||||
│ │
|
||||
│ Melhor nota: 90/100 (90%) │
|
||||
│ │
|
||||
│ [Fazer Prova Novamente] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Correção pelo Professor
|
||||
|
||||
**Local:** `/dashboard/teacher/assignments/[assignmentId]/results`
|
||||
|
||||
**O que o professor vê:**
|
||||
- Lista de todos os alunos da turma
|
||||
- Tentativas de cada aluno
|
||||
- Respostas de cada tentativa
|
||||
- Botão para corrigir manualmente
|
||||
|
||||
**Processo de Correção:**
|
||||
1. Professor clica em "Corrigir" em uma tentativa
|
||||
2. Sistema abre modal com as questões e respostas
|
||||
3. Professor atribui nota manualmente
|
||||
4. Sistema salva a nota
|
||||
5. Aluno pode ver os resultados
|
||||
|
||||
---
|
||||
|
||||
## Fluxo Completo com Repetição
|
||||
|
||||
### Cenário: Prova com 3 tentativas permitidas
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 1. CRIAÇÃO DO TEMPLATE │
|
||||
│ Professor cria "Prova de Inglês - Unidade 1" │
|
||||
│ com 10 questões, 100 pontos, 30 minutos │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 2. ATRIBUIÇÃO DA PROVA │
|
||||
│ Professor atribui à "Turma A" │
|
||||
│ - allowRetakes: true │
|
||||
│ - maxAttempts: 3 │
|
||||
│ - startDate: 01/02/2025 08:00 │
|
||||
│ - endDate: 01/02/2025 18:00 │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 3. ALUNO VÊ A PROVA │
|
||||
│ Status: "Disponível" │
|
||||
│ Botão: "Fazer Prova" │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 4. 1ª TENTATIVA │
|
||||
│ Aluno clica em "Fazer Prova" │
|
||||
│ Sistema verifica: │
|
||||
│ ✓ Dentro do período? SIM │
|
||||
│ ✓ Tentativas < 3? SIM (0 < 3) │
|
||||
│ Sistema cria tentativa #1 │
|
||||
│ Aluno faz a prova (30 min) │
|
||||
│ Aluno envia │
|
||||
│ Resultado: 60/100 (60%) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 5. ALUNO VÊ RESULTADOS │
|
||||
│ Melhor nota: 60/100 (60%) │
|
||||
│ Botão: "Fazer Prova Novamente" │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 6. 2ª TENTATIVA │
|
||||
│ Aluno clica em "Fazer Prova Novamente" │
|
||||
│ Sistema verifica: │
|
||||
│ ✓ Dentro do período? SIM │
|
||||
│ ✓ Tentativas < 3? SIM (1 < 3) │
|
||||
│ Sistema cria tentativa #2 │
|
||||
│ Aluno faz a prova (30 min) │
|
||||
│ Aluno envia │
|
||||
│ Resultado: 80/100 (80%) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 7. ALUNO VÊ RESULTADOS │
|
||||
│ Melhor nota: 80/100 (80%) │
|
||||
│ Botão: "Fazer Prova Novamente" │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 8. 3ª TENTATIVA │
|
||||
│ Aluno clica em "Fazer Prova Novamente" │
|
||||
│ Sistema verifica: │
|
||||
│ ✓ Dentro do período? SIM │
|
||||
│ ✓ Tentativas < 3? SIM (2 < 3) │
|
||||
│ Sistema cria tentativa #3 │
|
||||
│ Aluno faz a prova (30 min) │
|
||||
│ Aluno envia │
|
||||
│ Resultado: 90/100 (90%) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 9. ALUNO TENTA NOVAMENTE │
|
||||
│ Aluno clica em "Fazer Prova Novamente" │
|
||||
│ Sistema verifica: │
|
||||
│ ✓ Dentro do período? SIM │
|
||||
│ ✗ Tentativas < 3? NÃO (3 = 3) │
|
||||
│ Sistema bloqueia: │
|
||||
│ "Maximum attempts (3) reached" │
|
||||
│ Botão "Fazer Prova" desabilitado │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Regras Importantes
|
||||
|
||||
### 1. Período de Disponibilidade
|
||||
- Aluno só pode fazer a prova entre `startDate` e `endDate`
|
||||
- Se tentar antes: "Prova ainda não começou"
|
||||
- Se tentar depois: "Prova já encerrou"
|
||||
|
||||
### 2. Tentativas em Andamento
|
||||
- Se aluno tiver uma tentativa com status `"in_progress"`, não pode criar outra
|
||||
- Sistema deve permitir continuar a tentativa existente
|
||||
|
||||
### 3. Máximo de Tentativas
|
||||
- Aluno não pode exceder `maxAttempts`
|
||||
- Se `allowRetakes` for `false`, `maxAttempts` deve ser `1`
|
||||
|
||||
### 4. Tempo Limite
|
||||
- Se `timeLimit` estiver definido, prova é enviada automaticamente quando acabar
|
||||
- Contador é atualizado a cada segundo
|
||||
|
||||
### 5. Resultados
|
||||
- Se `showResultsAfterGrading` for `true`, aluno vê resultados imediatamente
|
||||
- Se for `false`, aluno vê mensagem aguardando correção
|
||||
|
||||
---
|
||||
|
||||
## Melhorias Sugeridas
|
||||
|
||||
1. **Salvamento Automático:**
|
||||
- Salvar respostas periodicamente (ex: a cada 30 segundos)
|
||||
- Permitir continuar de onde parou em caso de desconexão
|
||||
|
||||
2. **Notificações:**
|
||||
- Avisar aluno quando prova estiver prestes a encerrar
|
||||
- Avisar professor quando aluno enviar prova
|
||||
|
||||
3. **Histórico de Tentativas:**
|
||||
- Mostrar data/hora de cada tentativa
|
||||
- Mostrar tempo gasto em cada tentativa
|
||||
|
||||
4. **Estatísticas:**
|
||||
- Média da turma
|
||||
- Comparação com outros alunos (opcional)
|
||||
|
||||
5. **Feedback Imediato:**
|
||||
- Mostrar quais questões o aluno acertou/errou (opcional)
|
||||
- Permitir revisão da prova após correção
|
||||
|
||||
---
|
||||
|
||||
## Conclusão
|
||||
|
||||
O sistema de provas é flexível e permite:
|
||||
|
||||
✅ **Criação de templates reutilizáveis**
|
||||
✅ **Atribuição com configurações personalizadas**
|
||||
✅ **Controle de tentativas e repetições**
|
||||
✅ **Período de disponibilidade configurável**
|
||||
✅ **Tempo limite opcional**
|
||||
✅ **Resultados configuráveis (imediatos ou após correção)**
|
||||
✅ **Histórico completo de tentativas**
|
||||
|
||||
Para dúvidas ou sugestões de melhoria, consulte a equipe de desenvolvimento.
|
||||
Reference in New Issue
Block a user