| Linha 76: | Linha 76: | ||
=== Fase 2 - 2025-2 === | === Fase 2 - 2025-2 === | ||
*<b>create schema if not exists "college_helper";</b> | *<b>create schema if not exists "college_helper";</b> | ||
**<b>CREATE TABLE if not exists college_helper.curso </b> | **<b>CREATE TABLE if not exists college_helper.curso </b> | ||
<pre> | <pre> | ||
id SERIAL PRIMARY KEY, | id SERIAL PRIMARY KEY, | ||
| Linha 89: | Linha 89: | ||
</pre> | </pre> | ||
CREATE TABLE if not exists college_helper.disciplina | |||
CREATE TABLE if not exists college_helper.disciplina | |||
<pre> | |||
id SERIAL PRIMARY KEY, | id SERIAL PRIMARY KEY, | ||
nome TEXT NOT NULL, | nome TEXT NOT NULL, | ||
| Linha 96: | Linha 99: | ||
nome_professor TEXT, | nome_professor TEXT, | ||
curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET NULL | curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET NULL | ||
</pre> | |||
CREATE TABLE if not exists college_helper.disciplina_requisito | CREATE TABLE if not exists college_helper.disciplina_requisito | ||
<pre> | |||
disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | ||
requisito_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | requisito_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | ||
PRIMARY KEY (disciplina_id, requisito_id) | PRIMARY KEY (disciplina_id, requisito_id) | ||
</pre> | |||
CREATE TABLE if not exists college_helper.horario_aula | CREATE TABLE if not exists college_helper.horario_aula | ||
<pre> | |||
id SERIAL PRIMARY KEY, | id SERIAL PRIMARY KEY, | ||
dia_semana INT NOT NULL, -- 1 a 7 | dia_semana INT NOT NULL, -- 1 a 7 | ||
hora_inicio TIME NOT NULL, | hora_inicio TIME NOT NULL, | ||
hora_fim TIME NOT NULL | hora_fim TIME NOT NULL | ||
</pre> | |||
CREATE TABLE if not exists college_helper.disciplina_horario | CREATE TABLE if not exists college_helper.disciplina_horario | ||
<pre> | |||
disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | ||
horario_id INT NOT NULL REFERENCES college_helper.horario_aula(id) ON DELETE CASCADE, | horario_id INT NOT NULL REFERENCES college_helper.horario_aula(id) ON DELETE CASCADE, | ||
PRIMARY KEY (disciplina_id, horario_id) | PRIMARY KEY (disciplina_id, horario_id) | ||
</pre> | |||
create extension if not exists pgcrypto; | create extension if not exists pgcrypto; | ||
create table if not exists college_helper.usuario | create table if not exists college_helper.usuario | ||
<pre> | |||
id UUID primary key default gen_random_uuid(), | id UUID primary key default gen_random_uuid(), | ||
nome text not null, | nome text not null, | ||
| Linha 126: | Linha 133: | ||
constraint valid_roles | constraint valid_roles | ||
check (perfil in ('ESTUDANTE', 'ADMIN')) | check (perfil in ('ESTUDANTE', 'ADMIN')) | ||
</pre> | |||
CREATE TABLE if not exists college_helper.aluno | CREATE TABLE if not exists college_helper.aluno | ||
<pre> | |||
id SERIAL PRIMARY KEY, | id SERIAL PRIMARY KEY, | ||
nome TEXT NOT NULL, | nome TEXT NOT NULL, | ||
| Linha 136: | Linha 144: | ||
curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET null, | curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET null, | ||
usuario_id uuid not null references college_helper.usuario(id) on delete cascade | usuario_id uuid not null references college_helper.usuario(id) on delete cascade | ||
</pre> | |||
CREATE TABLE if not exists college_helper.grade_horaria | CREATE TABLE if not exists college_helper.grade_horaria | ||
<pre> | |||
id SERIAL PRIMARY KEY, | id SERIAL PRIMARY KEY, | ||
aluno_id INT UNIQUE REFERENCES college_helper.aluno(id) ON DELETE CASCADE | aluno_id INT UNIQUE REFERENCES college_helper.aluno(id) ON DELETE CASCADE | ||
</pre> | |||
CREATE TABLE if not exists college_helper.grade_horaria_disponibilidade | CREATE TABLE if not exists college_helper.grade_horaria_disponibilidade | ||
<pre> | |||
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | ||
horario INTEGER NOT NULL, | horario INTEGER NOT NULL, | ||
PRIMARY KEY (grade_id, horario) | PRIMARY KEY (grade_id, horario) | ||
</pre> | |||
CREATE TABLE if not exists college_helper.grade_horaria_preferencia | CREATE TABLE if not exists college_helper.grade_horaria_preferencia | ||
</pre> | |||
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | ||
horario INTEGER NOT NULL, | horario INTEGER NOT NULL, | ||
PRIMARY KEY (grade_id, horario) | PRIMARY KEY (grade_id, horario) | ||
</pre> | |||
CREATE TABLE if not exists college_helper.grade_horaria_disciplina | CREATE TABLE if not exists college_helper.grade_horaria_disciplina | ||
<pre> | |||
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, | ||
disciplina_id INT REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | disciplina_id INT REFERENCES college_helper.disciplina(id) ON DELETE CASCADE, | ||
PRIMARY KEY (grade_id, disciplina_id) | PRIMARY KEY (grade_id, disciplina_id) | ||
</pre> | |||
-- Creates a user | -- Creates a user | ||
-- if the role is from "ESTUDANTE" or "ADMIN", the DB will prevent the insertion | -- if the role is from "ESTUDANTE" or "ADMIN", the DB will prevent the insertion | ||
<pre> | |||
insert into college_helper.usuario(nome, email, hash_senha, perfil) values ('Paulo Oliveira', 'paulo@email.com', '123123123', 'ADMIN'); | insert into college_helper.usuario(nome, email, hash_senha, perfil) values ('Paulo Oliveira', 'paulo@email.com', '123123123', 'ADMIN'); | ||
select * from college_helper.usuario; | select * from college_helper.usuario; | ||
</pre> | |||
== Requisitos Não-Funcionais == | == Requisitos Não-Funcionais == | ||
Edição das 22h50min de 27 de novembro de 2025
Fase 2
Escopo
- Desenvolver um aplicativo para uso dos universitários da faculdade UFU (Universidade Federal de Uberlândia), no qual seja possível definir a grade horária mais compatível com o aluno de acordo com o curso que o mesmo está matriculado e as matérias que ainda estão disponíveis para matrícula, baseando-se na rotina definida pelo aluno.
Requisitos Funcionais
Fase 1 - 2025-1
- RF01 - Cadastro
- O sistema deve permitir que o aluno realize o cadastro com nome, e-mail, matrícula e senha
- RF02 - Login
- O sistema deve permitir que o usuário realize login na plataforma utilizando seus dados, para ter uma experiencia customizada
- RF03 - Recuperação de senha
- O sistema deve permitir que o usuário recupere sua senha perdida por meio de um e-mail secundário ou número de telefone
Grade Curricular: requisitos que se relacionam e interagem com disciplinas, horários, matrícula, carga horária, pré-requisitos em disciplinas.
- RF04 - Listar disciplinas disponíveis
- O sistema deve exibir a lista de disciplinas disponíveis para o semestre atual, deixando para que o usuário escolha entre elas
- RF05 - Selecionar disciplinas
- O sistema deve permitir que o usuário selecione e peça a matrícula das disciplinas que ele desejar
- RF06 - Verificar conflitos entre disciplinas
- O sistema deve verificar e alertar o usuário de possíveis conflitos de horário ao selecionar as disciplinas desejadas
- RF07 - Validar Pré-requisitos
- O sistema deve validar os pré-requisitos antes de permitir a matrícula em uma disciplina
- RF08 - Verificar carga horária
- O sistema deve verificar a carga mínima e máxima permitida
- RF09 - Disponibilidade de vagas
- O sistema deve informar ao aluno a disponibilidade de vagas nas disciplinas selecionadas
Personalização de Grade
- RF10 - Preferencias de horários
- O sistema deve permitir que o aluno defina preferencias de horários e dias livres
- RF11 - Opções diferentes de grade curricular
- O sistema deve permitir que o aluno visualize diferentes opções de grades antes de confirmar a escolha
Ajuste e Modificação
- RF12 - Edição da grade
- sistema deve permitir que o aluno modifique sua grade, adicionando ou removendo disciplinas dentro do período de ajuste acadêmico
- RF13 - Exclusão de disciplinas
- O sistema deve alertar o aluno caso o trancamento ou exclusão de uma disciplina comprometa a progressão ou organização da grade
Fase 2 - 2025-2
- create schema if not exists "college_helper";
- CREATE TABLE if not exists college_helper.curso
id SERIAL PRIMARY KEY,
nome TEXT NOT NULL,
coordenador TEXT,
codigo_do_curso BIGINT UNIQUE
CREATE TABLE if not exists college_helper.disciplina
id SERIAL PRIMARY KEY,
nome TEXT NOT NULL,
carga_horaria INTEGER NOT NULL,
periodo TEXT,
nome_professor TEXT,
curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET NULL
CREATE TABLE if not exists college_helper.disciplina_requisito
disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
requisito_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
PRIMARY KEY (disciplina_id, requisito_id)
CREATE TABLE if not exists college_helper.horario_aula
id SERIAL PRIMARY KEY,
dia_semana INT NOT NULL, -- 1 a 7
hora_inicio TIME NOT NULL,
hora_fim TIME NOT NULL
CREATE TABLE if not exists college_helper.disciplina_horario
disciplina_id INT NOT NULL REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
horario_id INT NOT NULL REFERENCES college_helper.horario_aula(id) ON DELETE CASCADE,
PRIMARY KEY (disciplina_id, horario_id)
create extension if not exists pgcrypto; create table if not exists college_helper.usuario
id UUID primary key default gen_random_uuid(),
nome text not null,
email text not null,
hash_senha text not null,
perfil text not null
constraint valid_roles
check (perfil in ('ESTUDANTE', 'ADMIN'))
CREATE TABLE if not exists college_helper.aluno
id SERIAL PRIMARY KEY,
nome TEXT NOT NULL,
matricula TEXT NOT NULL,
data_nascimento DATE,
periodo TEXT,
curso_id INT REFERENCES college_helper.curso(id) ON DELETE SET null,
usuario_id uuid not null references college_helper.usuario(id) on delete cascade
CREATE TABLE if not exists college_helper.grade_horaria
id SERIAL PRIMARY KEY,
aluno_id INT UNIQUE REFERENCES college_helper.aluno(id) ON DELETE CASCADE
CREATE TABLE if not exists college_helper.grade_horaria_disponibilidade
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
horario INTEGER NOT NULL,
PRIMARY KEY (grade_id, horario)
CREATE TABLE if not exists college_helper.grade_horaria_preferencia
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE, horario INTEGER NOT NULL, PRIMARY KEY (grade_id, horario)
CREATE TABLE if not exists college_helper.grade_horaria_disciplina
grade_id INT REFERENCES college_helper.grade_horaria(id) ON DELETE CASCADE,
disciplina_id INT REFERENCES college_helper.disciplina(id) ON DELETE CASCADE,
PRIMARY KEY (grade_id, disciplina_id)
-- Creates a user -- if the role is from "ESTUDANTE" or "ADMIN", the DB will prevent the insertion
insert into college_helper.usuario(nome, email, hash_senha, perfil) values ('Paulo Oliveira', 'paulo@email.com', '123123123', 'ADMIN');
select * from college_helper.usuario;
Requisitos Não-Funcionais
- RNF01 - Interface Amigável [Usabilidade]
- O sistema deve possuir uma interface intuitiva e de fácil uso para estudantes sem conhecimento técnico.
- RNF02 - Responsividade
- A interface deve ser responsiva, permitindo o uso em diferentes dispositivos (computadores, tablets e smartphones).
- RNF03 - Disponibilidade
- O sistema deve ter uma disponibilidade de 99,5%, garantindo que os alunos possam acessar a qualquer momento
- RNF04 - Auto-Recuperação
- Deve possuir um mecanismo de recuperação automática em caso de falha.
- RNF05 - Tempo de Resposta [Desempenho ]
- O sistema deve processar a simulação da grade curricular em no máximo 2 segundos.
- RNF06 - Atualização em Tempo Real [Desempenho]
- A integração com o sistema deve ocorrer em tempo real, garantindo informações atualizadas sobre disciplinas e vagas Segurança
- RNF07 - Legalmente dentro dos padrões
- O sistema deve estar em conformidade com a legislação vigente sobre proteção de dados (LGPD).
- RNF08 - Criptografia de Dados
- Os dados dos usuários devem ser armazenados de forma criptografada.
- RNF09 - Suporte para Atualizações [Distribuição]
- Deve oferecer suporte para atualizações automáticas sem perda de dados.
- RNF10 - Orientação a Objetos [Padrões]
- O código deve ser feito totalmente orientado a objetos, sendo a linguagem de escolha C#, para maior compatibilidade com as demais ferramentas já utilizadas e para maior escalabilidade.
- RNF11 - Sistema Operacional [Hardware e software]
- O sistema deve ser compatível com servidores Linux e Windows.
Melhores Práticas
1) Uso de modelos Pydantic, garantindo padronização validação e conversão dos dados
- class TimeSlot(BaseModel):
start: str
end: str
- class DaySchedule(BaseModel):
day: str
available: bool
timeSlots: List[TimeSlot]
- class UploadedSubject(BaseModel):
name: str
schedule: str
credits: int
difficulty: int
- class FormData(BaseModel):
subjectCount: int
preferenceStrategy: str
prioritizeDependencies: bool
includeSaturday: bool
weeklySchedule: List[DaySchedule]
additionalNotes: Optional[str] = ""
uploadedSubjects: List[UploadedSubject]
totalAvailableHours: float
2) Padrão de Nome Snake Case
def normalize(lst): async def submit_preferences(form_data: FormData): getCollegeGradeFromFile(subjects_list)
3) Documentação por modulo:
- CHATGPT INTEGRATION MODULE
This module provides AI-powered subject advisory services using OpenAI's ChatGPT.
4) Separação de servidores, front e back rodam separados
5) Nomenclatura auto explicativa
const [showPassword, setShowPassword] = useState(false)
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState("")
const [success, setSuccess] = useState("")
6) Tratamento de erros
catch (err) {
if (err instanceof Error) {
if (err.message.includes("401")) {
setError("Invalid email or password.")
} else if (err.message.includes("500")) {
setError("Server error.")
} else if (err.message.includes("fetch")) {
setError("Unable to connect to server.")
} else {
setError(err.message || "An unexpected error occurred.")
}
}
}
Evolução do projeto
| Item | Data | College Helper | Realizado |
|---|---|---|---|
| 1 | 14/11/2025 | Documentar Investigação e Visão | 100% |
| 2 | 14/11/2025 | Criar Diagramas Comp/Implantação | 100% |
| 3 | 14/11/2025 | Definir Proposta de Projeto | 100% |
| 4 | 14/11/2025 | Validar Visão do Usuário | 100% |
| 5 | 17/11/2025 | Especificar RFs e RNFs - Fase 2 | 100% |
| 6 | 17/11/2025 | RF01: Modelar o BD | 80% |
| 7 | 01/12/2025 | Melhores Práticas | |
| 8 | 01/12/2025 | RF01: Modelar o BD | |
| 9 | RF02: Criar o BD | ||
| 10 | Desenvolver 3o RF | ||
| 11 | Desenvolver 4o RF | ||
| 12 | Incrementar diferencial tecnológico |