Skip to content

Commit 3f07fdb

Browse files
first commit
0 parents  commit 3f07fdb

File tree

9 files changed

+318
-0
lines changed

9 files changed

+318
-0
lines changed

.gitignore

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
!**/src/main/**/target/
4+
!**/src/test/**/target/
5+
6+
### IntelliJ IDEA ###
7+
.idea
8+
.idea/modules.xml
9+
.idea/jarRepositories.xml
10+
.idea/compiler.xml
11+
.idea/libraries/
12+
*.iws
13+
*.iml
14+
*.ipr
15+
16+
### Eclipse ###
17+
.apt_generated
18+
.classpath
19+
.factorypath
20+
.project
21+
.settings
22+
.springBeans
23+
.sts4-cache
24+
25+
### NetBeans ###
26+
/nbproject/private/
27+
/nbbuild/
28+
/dist/
29+
/nbdist/
30+
/.nb-gradle/
31+
build/
32+
!**/src/main/**/build/
33+
!**/src/test/**/build/
34+
35+
### VS Code ###
36+
.vscode/
37+
38+
### Mac OS ###
39+
.DS_Store

README.md

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Desafio – Livraria Virtual
2+
3+
## 1. Introdução
4+
Este projeto consiste em implementar um sistema de gerenciamento de uma livraria virtual, explorando os conceitos de composição, herança e polimorfismo. O sistema deve seguir o diagrama de classes UML mostrado abaixo, onde os construtores e os métodos de acesso (getters e setters) foram omitidos:
5+
6+
![Diagrama UML](uml.jpg)
7+
8+
## 2. Descrição do Sistema
9+
O sistema deverá ser baseado em um menu, com entrada de dados via console, contendo as seguintes opções:
10+
11+
- **Cadastrar livro**: Esta opção permite ao usuário cadastrar um livro.
12+
- **Realizar uma venda**: Esta opção permite ao usuário realizar a venda de um ou mais livros.
13+
- **Listar livros**: O sistema deverá listar todos os livros cadastrados, sejam eles eletrônicos ou impressos.
14+
- **Listar vendas**: O sistema deverá listar todas as vendas realizadas.
15+
- **Sair do programa**: Encerra a execução do programa.
16+
17+
## 3. Descrição das Classes
18+
A seguir, são descritas as classes do sistema.
19+
20+
### 3.1 Livro
21+
A classe abstrata `Livro` possui 4 atributos:
22+
23+
- `titulo`: título do livro;
24+
- `autores`: nome do autor ou dos autores do livro;
25+
- `editora`: nome da editora do livro;
26+
- `preco`: preço do livro.
27+
28+
Os métodos de acesso (getters e setters) e o(s) construtor(es) desta classe e das demais classes foram omitidos e devem ser implementados, mesmo que você não os julgue necessário. O outro método obrigatório da classe `Livro` é descrito a seguir:
29+
30+
- `String toString()`: devolve uma representação textual dos atributos de um livro.
31+
32+
### 3.2 Impresso
33+
A classe `Impresso` representa um livro impresso e possui 2 atributos:
34+
35+
- `frete`: frete cobrado para entrega do livro;
36+
- `estoque`: número de exemplares do livro em estoque.
37+
38+
A seguir, são descritos os métodos da classe `Impresso`:
39+
40+
- `void atualizarEstoque()`: este método deve subtrair 1 do valor do atributo `estoque`;
41+
- `String toString()`: este método devolve uma representação textual de todos os atributos de um livro impresso.
42+
43+
### 3.3 Eletronico
44+
A classe `Eletronico` representa um livro eletrônico e possui 1 atributo:
45+
46+
- `tamanho`: representa o tamanho do arquivo eletrônico do livro em KB.
47+
48+
A seguir, é descrito mais um método obrigatório da classe `Eletronico`:
49+
50+
- `String toString()`: este método devolve uma representação textual de todos os atributos de um livro eletrônico.
51+
52+
### 3.4 Venda
53+
A classe `Venda` possui 5 atributos:
54+
55+
- `livros`: um vetor de referências a objetos do tipo `Livro`, representando os livros associados a uma venda;
56+
- `numVendas`: atributo estático que representa a quantidade de vendas realizadas. Deve ser incrementado de 1 sempre que uma nova venda for realizada;
57+
- `numero`: representa o número da venda, sendo um valor sequencial com início em 1, que é incrementado a cada venda. Utilize o valor do atributo `numVendas` para definir o valor desse atributo;
58+
- `cliente`: nome do cliente que comprou o(s) livro(s);
59+
- `valor`: valor total da venda.
60+
61+
A seguir, são descritos os métodos da classe `Venda`:
62+
63+
- `addLivro(l: Livro, index: int)`: adiciona o livro `l` na posição `index` do array `livros`;
64+
- `listarLivros()`: lista todos os livros da venda.
65+
66+
### 3.5 LivrariaVirtual
67+
A classe `LivrariaVirtual` possui 9 atributos:
68+
69+
- `MAX_IMPRESSOS`: constante que representa o número máximo de livros impressos que podem ser cadastrados;
70+
- `MAX_ELETRONICOS`: constante que representa o número máximo de livros eletrônicos que podem ser cadastrados;
71+
- `MAX_VENDAS`: constante que representa o número máximo de vendas que podem ser cadastradas;
72+
- `impressos`: vetor de referências a objetos da classe `Impresso`, representando os livros impressos cadastrados;
73+
- `eletronicos`: vetor de referências a objetos da classe `Eletronico`, representando os livros eletrônicos cadastrados;
74+
- `vendas`: vetor de referências a objetos da classe `Venda`, representando as vendas realizadas;
75+
- `numImpressos`: número de livros impressos cadastrados;
76+
- `numEletronicos`: número de livros eletrônicos cadastrados;
77+
- `numVendas`: número de vendas realizadas.
78+
79+
A seguir, são descritos os métodos da classe `LivrariaVirtual`:
80+
81+
- `cadastrarLivro()`: Este método é invocado quando a primeira opção do menu do sistema (Cadastrar livro) for selecionada. O usuário deve informar o tipo de livro que será cadastrado: impresso, eletrônico ou ambos. Depois, o sistema deve solicitar os dados do tipo de livro escolhido (ou de ambos). Se não houver mais espaço no vetor para cadastrar um novo livro, o sistema deve exibir uma mensagem.
82+
- `realizarVenda()`: Este método é invocado quando a segunda opção do menu do sistema (Realizar uma venda) é selecionada. O sistema deve solicitar o nome do cliente e a quantidade de livros que ele deseja comprar. Depois, para cada livro, o sistema deve solicitar seu tipo (impresso ou eletrônico), exibir a lista de livros do tipo escolhido e permitir que o usuário escolha um dos livros dessa lista. Utilize os métodos `listarLivrosImpressos()` e `listarLivrosEletronicos()` descritos a seguir.
83+
- `listarLivrosImpressos()`: Exibe no vídeo, no formato de tabela, os dados de todos os livros impressos cadastrados. Utilize o método `toString()` da classe `Impresso`.
84+
- `listarLivrosEletronicos()`: Exibe no vídeo, no formato de tabela, os dados de todos os livros eletrônicos cadastrados. Utilize o método `toString()` da classe `Eletronico`.
85+
- `listarLivros()`: Este método é invocado quando a terceira opção do menu do sistema (Listar livros) é selecionada. O método exibe no vídeo os dados de todos os livros impressos e eletrônicos cadastrados. Utilize os métodos `listarLivrosImpressos()` e `listarLivrosEletronicos()`.
86+
- `listarVendas()`: Este método é invocado quando a quarta opção do menu do sistema (Listar vendas) é selecionada. O método exibe no vídeo os dados de todas as vendas realizadas.
87+
- `main(args: String[])`: Este método deve instanciar um objeto da classe `LivrariaVirtual`, exibir repetidamente o menu de opções e invocar os métodos apropriados a partir da seleção do usuário.
88+
89+
## Observações
90+
- Os fontes da aplicação devem ser enviados para o GitHub até a data de entrega do projeto;
91+
- Critérios de avaliação: Utilizar banco de dados para inserir os pedidos será um diferencial.
92+
93+
**Corretude:** 70%
94+
**Interface:** 20%
95+
**Legibilidade:** 10%

docker-compose.yml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
version: '3'
2+
services:
3+
mysql-container:
4+
image: mysql:latest
5+
container_name: mysql-container
6+
ports:
7+
- "3306:3306"
8+
environment:
9+
MYSQL_ROOT_PASSWORD: admin
10+
MYSQL_USER: admin
11+
MYSQL_PASSWORD: admin
12+
MYSQL_DATABASE: livrariavirtual
13+
14+

pom.xml

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>org.example</groupId>
8+
<artifactId>LivrariaVirtual</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
<properties>
12+
<maven.compiler.source>20</maven.compiler.source>
13+
<maven.compiler.target>20</maven.compiler.target>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
</properties>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>org.hibernate.orm</groupId>
20+
<artifactId>hibernate-core</artifactId>
21+
<version>6.0.2.Final</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>mysql</groupId>
25+
<artifactId>mysql-connector-java</artifactId>
26+
<version>8.0.33</version>
27+
</dependency>
28+
29+
</dependencies>
30+
31+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package br.com.livraria.model;
2+
3+
import jakarta.persistence.Entity;
4+
5+
@Entity
6+
public class Eletronico extends Livro {
7+
private int tamanho;
8+
9+
10+
public Eletronico() {
11+
}
12+
public Eletronico(String titulo, String autores, String editora, float preco, int tamanho) {
13+
super(titulo, autores, editora, preco);
14+
this.tamanho = tamanho;
15+
}
16+
17+
public int getTamanho() {
18+
return tamanho;
19+
}
20+
21+
public void setTamanho(int tamanho) {
22+
this.tamanho = tamanho;
23+
}
24+
25+
26+
27+
@Override
28+
public String toString() {
29+
return String.format(
30+
"%s, Tamanho: %d KB",
31+
super.toString(), tamanho
32+
);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package br.com.livraria.model;
2+
3+
import jakarta.persistence.Entity;
4+
5+
@Entity
6+
public class Impresso extends Livro {
7+
private float frete;
8+
private int estoque;
9+
10+
11+
public Impresso() {
12+
13+
}
14+
15+
public Impresso(String titulo, String autores, String editora, float preco, float frete, int estoque) {
16+
super(titulo, autores, editora, preco);
17+
this.frete = frete;
18+
this.estoque = estoque;
19+
}
20+
21+
public float getFrete() {
22+
return frete;
23+
}
24+
25+
public void setFrete(float frete) {
26+
this.frete = frete;
27+
}
28+
29+
public int getEstoque() {
30+
return estoque;
31+
}
32+
33+
public void setEstoque(int estoque) {
34+
this.estoque = estoque;
35+
}
36+
37+
public void atualizarEstoque(int quantidade) {
38+
if (estoque >= quantidade) {
39+
estoque -= quantidade;
40+
} else {
41+
System.out.println("Estoque insuficiente.");
42+
}
43+
}
44+
45+
@Override
46+
public String toString() {
47+
return String.format(
48+
"%s, Frete: %.2f, Estoque: %d unidades",
49+
super.toString(), frete, estoque
50+
);
51+
}
52+
}
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package util;
2+
3+
import jakarta.persistence.EntityManager;
4+
import jakarta.persistence.EntityManagerFactory;
5+
import jakarta.persistence.Persistence;
6+
7+
public class EntityManagerUtil {
8+
9+
private static final String PERSISTENCE_UNIT_NAME = "livrariavirtual";
10+
private static EntityManagerFactory entityManagerFactory;
11+
12+
static {
13+
entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
14+
}
15+
16+
public static EntityManager getEntityManager() {
17+
return entityManagerFactory.createEntityManager();
18+
}
19+
20+
public static void closeEntityManagerFactory() {
21+
if (entityManagerFactory != null && entityManagerFactory.isOpen()) {
22+
entityManagerFactory.close();
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
5+
version="3.0">
6+
<persistence-unit name="livrariavirtual">
7+
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
8+
<class>br.com.livraria.model.Livro</class>
9+
<class>br.com.livraria.model.Impresso</class>
10+
<class>br.com.livraria.model.Eletronico</class>
11+
<class>br.com.livraria.model.Venda</class>
12+
<class>br.com.livraria.LivrariaVirtual</class>
13+
<properties>
14+
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/livrariavirtual"/>
15+
<property name="javax.persistence.jdbc.user" value="admin"/>
16+
<property name="javax.persistence.jdbc.password" value="admin"/>
17+
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
18+
19+
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
20+
21+
<property name="hibernate.show_sql" value="false"/>
22+
23+
<property name="hibernate.format_sql" value="false"/>
24+
25+
<property name="hibernate.hbm2ddl.auto" value="update"/>
26+
</properties>
27+
</persistence-unit>
28+
</persistence>

uml.jpg

114 KB
Loading

0 commit comments

Comments
 (0)