ПИА/Јануар 2022
Ispit u januarskom ispitnom roku 2022. godine održan je 21. januara. Bilo je moguće raditi u Java Server Faces ili Angular i Node.js tehnologijama, od čega je za prvi kolokvijum bila Java Server Faces a za drugi Angular i Node.js tehnologije. Postavka zadatka je bila ista za oba kolokvijuma. Svaki kolokvijum je trajao 2 sata, dok ako se rade oba to traje 3 sata. Na stranici predmeta dostupan je tekst zadatka kao i baze podataka za MySQL i MongoDB.
Postavka
Napraviti sledeću mini internet aplikaciju za piceriju.
Na početnoj strani aplikacije, napraviti HTML formu, preko koje mogu da se prijavljuju korisnici sistema, a to su kupci i radnici. Korisnici treba da imaju mogućnost unošenja korisničkog imena i lozinke i da pomoću radio dugmeta odaberu: da li se prijavljuju u sistem kao kupci ili radnici. U slučaju ispravno unetih podataka, korisniku treba omogućiti rad sa ostatkom sistema (za svaki tip treba prikazati posebnu početnu stranicu nakon prijavljivanja). Ukoliko korisnik ne unese neki od podataka ili unese pogrešne podatke, potrebno je ispisati poruku greške crvenim slovima sa mogućnošću ispravljanja greške. Po uspešnoj prijavi u sistem, korisniku dati i opciju da se odjavi. [7 poena]
Kupac nakon prijave na sistem vidi svoje informacije (ime i prezime) i tabelarni prikaz svojih narudžbina (identifikator, veličinu pice, nazive dodataka i status narudžbine). [4 poena] Ispod tabelarnog prikaza nalazi se forma za naručivanje pice. Korisnik iz padajuće liste bira veličinu pice (fiksni podaci: mala, srednja, velika). Ispod odabira veličine biraju se dodaci za picu, putem niza checkbox-ova. Svaki dodatak je jedan checkbox, koji je onemogućen (disabled) ukoliko dodatka nema na stanju. Prikazati naziv i količinu dodatka. [6 poena] Klikom na dugme "Potvrdi" narudžbina se dodaje u bazu sa statusom "nova" (može da se ne odabere nijedan dodatak). Nakon dodavanja narudžbine treba osvežiti stranicu. [3 poena]
Radnik nakon prijave na sistem vidi tabelarni prikaz svih narudžbina u sistemu. [2 poena] Pored novih narudžbina u sistemu (status "nova") treba prikazati dugmad za prihvatanje ili odbijanje te narudžbine (prihvaćene narudžbine imaju status "prihvacena", odbijene imaju status "odbijena"), čime se menja status porudžbine. [5 poena] Prihvatanje narudžbine podrazumeva da se i ažurira količina svakog odabranog dodatka (smanji za 1). Odbijanje nema uticaja na količinu. Nakon promene statusa, osvežiti stranicu. [3 poena] Ispod tabele sa narudžbinama nalazi se tabela sa svim dodacima pomoću koje se može dopuniti i njihovo stanje. Tabela treba da sadrži naziv dodatka, trenutnu količinu proizvoda na stanju i dugme za naručivanje tog dodatka. Klikom na dugme za naručivanje se automatski uvećava količina na stanju za 5. [3 poena] Dodaci kojih nema na stanju treba da budu obojeni crvenom bojom. [2 poena]
Rešenje
Java Server Faces
Stranice
index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Pocetna</title>
</h:head>
<h:body>
<h3>Prijava na sistem</h3>
<h:form>
<h:panelGrid columns="2">
Korisnicko ime: <h:inputText value="#{login.korisnickoIme}"
required="true" requiredMessage="Morate uneti korisnicko ime"/>
Lozinka: <h:inputSecret id="lozinka" value="#{login.lozinka}"
required="true" requiredMessage="Morate uneti lozinku">
</h:inputSecret>
Tip:
<h:selectOneRadio value="#{login.tip}">
<f:selectItem itemLabel="kupac" itemValue="0"></f:selectItem>
<f:selectItem itemLabel="radnik" itemValue="1"></f:selectItem>
</h:selectOneRadio>
<h:commandButton value="Prijava" action="#{login.login()}" />
<br />
</h:panelGrid>
<h:messages style="color: red" />
<h:outputText value="#{login.greska}" style="color: red" />
</h:form>
</h:body>
</html>
kupac.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<title>Pocetna</title>
</h:head>
<h:body>
<h3>Kupac: #{login.tekuci().getIme()} #{login.tekuci().getPrezime()}</h3>
<h:form>
<h:commandButton value="Odjava" action="#{login.logout()}"></h:commandButton>
</h:form>
Vaše narudžbine:
<br/><!-- comment -->
<h:dataTable value="#{narudzbina.getMoje(login.tekuci())}" var="n">
<h:column>
<f:facet name="header">Id</f:facet>
#{n.id}
</h:column>
<h:column>
<f:facet name="header">Velicina</f:facet>
#{n.vel}
</h:column>
<h:column>
<f:facet name="header">Dodaci</f:facet>
#{n.dodaci}
</h:column>
<h:column>
<f:facet name="header">Status</f:facet>
#{n.status}
</h:column>
</h:dataTable>
<br/><!-- comment -->
<h2>Narucivanje pice</h2>
<h:form>
Veličina: <h:selectOneMenu value="#{narudzbina.vel}">
<f:selectItem itemValue="mala"></f:selectItem>
<f:selectItem itemValue="srednja"></f:selectItem>
<f:selectItem itemValue="velika"></f:selectItem>
</h:selectOneMenu>
<br/>
Izaberite dodatke:
<h:selectManyCheckbox value="#{narudzbina.dodaci_int}">
<f:selectItems value="#{narudzbina.dodaci}" var="d" itemLabel="#{d.getIme()} [#{d.getKolicina()}]" itemValue="#{d.getId()}" itemDisabled="#{d.getKolicina() le 0}"></f:selectItems>
</h:selectManyCheckbox>
<br/>
<h:commandButton action="#{narudzbina.naruci()}" value="Naruci"></h:commandButton>
</h:form>
</h:body>
</html>
radnik.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Pocetna</title>
<h:outputStylesheet library="" name="styles.css"/>
</h:head>
<h:body>
<h:form>
<h:commandButton value="Odjava" action="#{login.logout()}"></h:commandButton>
</h:form>
<h3>Narudzbine</h3>
<h:form>
<h:dataTable value="#{zaposleni.narudzbine}" var="n">
<h:column>
<f:facet name="header">Korisnik</f:facet>
#{n.idUser}
</h:column>
<h:column>
<f:facet name="header">Velicina</f:facet>
#{n.vel}
</h:column>
<h:column>
<f:facet name="header">Dodaci</f:facet>
#{n.dodaci}
</h:column>
<h:column>
<f:facet name="header">Status</f:facet>
#{n.status}
</h:column>
<h:column>
<f:facet name="header" >Akcija 1</f:facet>
<h:commandButton value="Prihvati" action="#{zaposleni.prihvati(n.id, n.idUser)}" rendered="#{n.status.equals('nova')}"></h:commandButton>
</h:column>
<h:column>
<f:facet name="header">Akcija 2</f:facet>
<h:commandButton value="Odbij" action="#{zaposleni.odbij(n.id, n.idUser)}" rendered="#{n.status.equals('nova')}"></h:commandButton>
</h:column>
</h:dataTable>
</h:form>
<h:form>
<h:dataTable value="#{zaposleni.dodaci_svi}" var="d">
<h:column class="#{(d.kolicina le 0) ? 'bgred' : ''}" >
<f:facet name="header">Ime</f:facet>
#{d.ime}
</h:column>
<h:column class="#{(d.kolicina le 0) ? 'bgred' : ''}">
<f:facet name="header">Kolicina</f:facet>
#{d.kolicina}
</h:column>
<h:column class="#{(d.kolicina le 0) ? 'bgred' : ''}">
<f:facet name="header">Naruci</f:facet>
<h:commandButton value="Naruci 5" action="#{zaposleni.naruci(d.id)}" class="#{(d.kolicina le 0) ? 'bgred' : ''}"></h:commandButton>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
Zrna
LoginManagedBean
package managed_beans;
import entities.Korisnik;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import jakarta.servlet.http.HttpSession;
import util.SessionUtils;
import util.dao.KorisnikDAO;
@Named(value = "login")
@RequestScoped
public class loginManagedBean {
public loginManagedBean() {
}
private String korisnickoIme;
private String lozinka;
private int tip;
private String greska = "";
public String getKorisnickoIme() {
return korisnickoIme;
}
public void setKorisnickoIme(String korisnickoIme) {
this.korisnickoIme = korisnickoIme;
}
public String getLozinka() {
return lozinka;
}
public void setLozinka(String lozinka) {
this.lozinka = lozinka;
}
public String getGreska() {
return greska;
}
public void setGreska(String greska) {
this.greska = greska;
}
public int getTip() {
return tip;
}
public void setTip(int tip) {
this.tip = tip;
}
public Korisnik tekuci(){
Korisnik k = (Korisnik) SessionUtils.getSession().getAttribute("korisnik");
return k;
}
public String login() {
KorisnikDAO kdao = new KorisnikDAO();
Korisnik k = kdao.getSpecific(korisnickoIme);
if (k != null) {
if (k.getLozinka().equals(lozinka)) {
SessionUtils.setAttribute("korisnik", k);
if (k.getTip() == 0 && k.getTip() == tip) {
return "kupac";
} else if (k.getTip() == 0 && k.getTip() != tip) {
greska = "Nepostojeci korisnik - kupac.";
return "";
} else if (k.getTip() == 1 && k.getTip() == tip) {
return "radnik";
} else {
greska = "Nepostojeci korisnik - radnik."+k.getTip() + " " + tip;
return "";
}
} else {
greska = "Pogresna lozinka.";
}
} else {
greska = "Nepostojeci korisnik.";
}
return "";
}
public String logout() {
SessionUtils.invalidate();
return "index.html?faces-redirect=true";
}
}
narudzbineManagedBeans
package managed_beans;
import entities.Dodatak;
import entities.Korisnik;
import entities.Narudzbina;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import java.util.ArrayList;
import java.util.List;
import util.dao.NarudzbineDAO;
@Named(value="narudzbina")
@RequestScoped
public class narudzbineManagedBeans {
private String vel;
private List<Dodatak> dodaci = new ArrayList<>();
private List<Integer> dodaci_int = new ArrayList<>();
public List<Integer> getDodaci_int() {
return dodaci_int;
}
public void setDodaci_int(List<Integer> dodaci_int) {
this.dodaci_int = dodaci_int;
}
public String getVel() {
return vel;
}
public void setVel(String vel) {
this.vel = vel;
}
public List<Dodatak> getDodaci() {
return dodaci;
}
public void setDodaci(List<Dodatak> dodaci) {
this.dodaci = dodaci;
}
public List<Narudzbina> getMoje(Korisnik k){
NarudzbineDAO nn = new NarudzbineDAO();
return nn.getAll(k);
}
@PostConstruct
public void init(){
NarudzbineDAO nn = new NarudzbineDAO();
dodaci = nn.dohvatiDodatke();
}
public List<Dodatak> dodaci(){
NarudzbineDAO nn = new NarudzbineDAO();
return nn.dohvatiDodatke();
}
public String naruci(){
NarudzbineDAO nn = new NarudzbineDAO();
nn.naruci(vel, dodaci_int);
return "kupac.xthml?faces-redirect=true";
}
}
zaposleniManagedBean
package managed_beans;
import entities.Dodatak;
import entities.Korisnik;
import entities.Narudzbina;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.RequestScoped;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.DB;
import util.SessionUtils;
import util.dao.KorisnikDAO;
import util.dao.NarudzbineDAO;
@Named(value="zaposleni")
@RequestScoped
public class zaposleniManagedBean {
private List<Narudzbina> narudzbine = new ArrayList<>();
private int id;
private String idUser;
private List<Dodatak> dodaci = new ArrayList<>();
private List<Dodatak> dodaci_svi = new ArrayList();
public List<Dodatak> getDodaci_svi() {
return dodaci_svi;
}
public void setDodaci_svi(List<Dodatak> dodaci_svi) {
this.dodaci_svi = dodaci_svi;
}
public String getIdUser() {
return idUser;
}
public void setIdUser(String idUser) {
this.idUser = idUser;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Dodatak> getDodaci() {
return dodaci;
}
public void setDodaci(List<Dodatak> dodaci) {
this.dodaci = dodaci;
}
public List<Narudzbina> getNarudzbine() {
return narudzbine;
}
public void setNarudzbine(List<Narudzbina> narudzbine) {
this.narudzbine = narudzbine;
}
public String naruci(int id){
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
}
try ( PreparedStatement ps = con.prepareStatement("update extras set amount=amount+5 where id=?")) {
ps.setInt(1, id);
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
NarudzbineDAO nn = new NarudzbineDAO();
dodaci_svi = nn.dohvatiDodatke();
return "zaposleni?faces-redirect=true";
}
public String odbij(int id, String idUser){
this.id = id;
this.idUser = idUser;
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
}
try ( PreparedStatement ps = con.prepareStatement("update orders set status=? where id=?")) {
ps.setString(1, "odbijena");
ps.setInt(2, id);
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
NarudzbineDAO nn;
nn = new NarudzbineDAO();
narudzbine = nn.getAll();
dodaci_svi = nn.dohvatiDodatke();
return "zaposleni?faces-redirect=true";
}
@PostConstruct
public void init(){
NarudzbineDAO nn = new NarudzbineDAO();
narudzbine = nn.getAll();
dodaci_svi = nn.dohvatiDodatke();
}
public String prihvati(int id, String idUser){
this.id = id;
this.idUser = idUser;
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
}
try ( PreparedStatement ps = con.prepareStatement("update orders set status=? where id=?")) {
ps.setString(1, "prihvacena");
ps.setInt(2, id);
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
NarudzbineDAO nn;
nn = new NarudzbineDAO();
KorisnikDAO kk = new KorisnikDAO();
Korisnik k = kk.getSpecific(idUser);
List<Narudzbina> narudzbine_lok = nn.getAll(k);
for(int j=0; j<narudzbine_lok.size(); j++){
Narudzbina n = narudzbine_lok.get(j);
if(n.getId()==id){
for(int i=0; i<n.getDodaci().size(); i++){
List<String> dodaci = n.getDodaci();
con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
}
try ( PreparedStatement ps = con.prepareStatement("update extras set amount=amount-1 where name=?")) {
ps.setString(1, dodaci.get(i));
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
}
}
}
nn = new NarudzbineDAO();
narudzbine = nn.getAll();
dodaci_svi = nn.dohvatiDodatke();
return "zaposleni?faces-redirect=true";
}
}
Entiteti
Korisnik
package entities;
public class Korisnik {
private String korisnicko_ime;
private String lozinka;
private String ime;
private String prezime;
private int tip;
public Korisnik() {
}
public Korisnik(String korisnicko_ime) {
this.korisnicko_ime = korisnicko_ime;
}
public String getKorisnicko_ime() {
return korisnicko_ime;
}
public void setKorisnicko_ime(String korisicko_ime) {
this.korisnicko_ime = korisicko_ime;
}
public String getLozinka() {
return lozinka;
}
public void setLozinka(String lozinka) {
this.lozinka = lozinka;
}
public String getIme() {
return ime;
}
public void setIme(String ime) {
this.ime = ime;
}
public String getPrezime() {
return prezime;
}
public void setPrezime(String prezime) {
this.prezime = prezime;
}
public int getTip() {
return tip;
}
public void setTip(int tip) {
this.tip = tip;
}
}
Dodatak
package entities;
public class Dodatak {
private String ime;
private int id;
private int kolicina;
public String getIme() {
return ime;
}
public void setIme(String ime) {
this.ime = ime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getKolicina() {
return kolicina;
}
public void setKolicina(int kolicina) {
this.kolicina = kolicina;
}
}
Narudzbina
package entities;
import java.util.ArrayList;
import java.util.List;
public class Narudzbina {
private int id;
private String idUser;
private String vel;
private String status;
private List<String> dodaci = new ArrayList<>();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getIdUser() {
return idUser;
}
public void setIdUser(String idUser) {
this.idUser = idUser;
}
public String getVel() {
return vel;
}
public void setVel(String vel) {
this.vel = vel;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<String> getDodaci() {
return dodaci;
}
public void setDodaci(List<String> dodaci) {
this.dodaci = dodaci;
}
}
Util.DAO
KorisnikDAO
package util.dao;
import entities.Korisnik;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.DB;
public class KorisnikDAO {
public List<Korisnik> getAll() {
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return null;
}
List<Korisnik> res = new ArrayList<>();
try ( Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from users")) {
while (rs.next()) {
Korisnik k = new Korisnik();
k.setKorisnicko_ime(rs.getString("username"));
k.setLozinka(rs.getString("password"));
k.setIme(rs.getString("first_name"));
k.setPrezime(rs.getString("last_name"));
k.setTip(rs.getString("type").equals("radnik") ? 1:0);
res.add(k);
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return res;
}
public Korisnik getSpecific(String id) {
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return null;
}
try ( PreparedStatement ps = con.prepareStatement("select * from users where username=?")) {
ps.setString(1, id);
try ( ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
Korisnik k = new Korisnik();
k.setKorisnicko_ime(rs.getString("username"));
k.setLozinka(rs.getString("password"));
k.setIme(rs.getString("first_name"));
k.setPrezime(rs.getString("last_name"));
k.setTip(rs.getString("type").equals("radnik") ? 1:0);
return k;
}
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return null;
}
}
NarudzbineDAO
package util.dao;
import entities.Dodatak;
import entities.Korisnik;
import entities.Narudzbina;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.DB;
import util.SessionUtils;
public class NarudzbineDAO {
public List<Narudzbina> getAll() {
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return null;
}
List<Narudzbina> res = new ArrayList<>();
try ( PreparedStatement ps = con.prepareStatement("select * from orders")) {
try ( ResultSet rs = ps.executeQuery()) {
while(rs.next()){
Narudzbina n = new Narudzbina();
n.setId(rs.getInt("id"));
n.setIdUser(rs.getString("user"));
n.setVel(rs.getString("size"));
n.setStatus(rs.getString("status"));
try ( PreparedStatement ps1 = con.prepareStatement("select E.name as sast from order_extras O join extras E on ( E.id = O.extras_id ) where (O.order_id=?)")) {
ps1.setInt(1, n.getId());
try ( ResultSet rs1 = ps1.executeQuery()) {
List<String> sastojci = new ArrayList();
while(rs1.next()){
sastojci.add(rs1.getString("sast"));
}
n.setDodaci(sastojci);
}
}
res.add(n);
}
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return res;
}
public List<Narudzbina> getAll(Korisnik k) {
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return null;
}
List<Narudzbina> res = new ArrayList<>();
try ( PreparedStatement ps = con.prepareStatement("select * from orders where user=?")) {
ps.setString(1, k.getKorisnicko_ime());
try ( ResultSet rs = ps.executeQuery()) {
while(rs.next()){
Narudzbina n = new Narudzbina();
n.setId(rs.getInt("id"));
n.setIdUser(rs.getString("user"));
n.setVel(rs.getString("size"));
n.setStatus(rs.getString("status"));
try ( PreparedStatement ps1 = con.prepareStatement("select E.name as sast from order_extras O join extras E on ( E.id = O.extras_id ) where (O.order_id=?)")) {
ps1.setInt(1, n.getId());
try ( ResultSet rs1 = ps1.executeQuery()) {
List<String> sastojci = new ArrayList();
while(rs1.next()){
sastojci.add(rs1.getString("sast"));
}
n.setDodaci(sastojci);
}
}
res.add(n);
}
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return res;
}
public List<Dodatak> dohvatiDodatke(){
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return null;
}
List<Dodatak> res = new ArrayList<>();
try ( PreparedStatement ps = con.prepareStatement("select * from extras")) {
try ( ResultSet rs = ps.executeQuery()) {
while(rs.next()){
Dodatak d = new Dodatak();
d.setId(rs.getInt("id"));
d.setIme(rs.getString("name"));
d.setKolicina(rs.getInt("amount"));
res.add(d);
}
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return res;
}
private int insertNarudzba(String vel){
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return -1;
}
try ( PreparedStatement ps = con.prepareStatement("insert into orders (user, size, status) values (?, ?, ?)")) {
Korisnik k = (Korisnik) SessionUtils.getSession().getAttribute("korisnik");
ps.setString(1, k.getKorisnicko_ime());
ps.setString(2, vel);
String s = "nova";
ps.setString(3, s);
return ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return -1;
}
private int unesiDodatak(int id_param, int dod_id){
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
return -1;
}
try ( PreparedStatement ps = con.prepareStatement("insert into order_extras values (?, ?)")) {
ps.setInt(1,id_param);
ps.setInt(2, dod_id);
return ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return -1;
}
public int dohvatiPoslednju(){
Connection con = DB.getInstance().getConnection();
if (con == null) {
System.err.println("*** GRESKA u konekciji ka bazi");
}
int ret=0;
try ( PreparedStatement ps = con.prepareStatement("select id from orders order by id DESC LIMIT 1")) {
try ( ResultSet rs = ps.executeQuery()) {
if(rs.next()){
return rs.getInt("id");
}
}
} catch (SQLException ex) {
Logger.getLogger(KorisnikDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DB.getInstance().putConnection(con);
}
return -1;
}
public void naruci(String vel, List<Integer> dodaci){
insertNarudzba(vel);
int id = dohvatiPoslednju();
if(id==-1) return;
for(int i=0; i<dodaci.size(); i++){
unesiDodatak(id, dodaci.get(i));
}
}
}
Angular i Node.js
Rešenje se može preuzeti kao ZIP arhiva. Kako biste ga pokrenuli:
- uvezite kolekcije iz JSON fajlova u
local
bazu unutar MongoDB - otvorite tri terminala
- u jednom se pozicionirajte unutar
backend
direktorijuma, pokrenitenpm install
a zatimnpm run watch-ts
direktorijuma (kako bi se konstantno nadgledao fajl sistem za promene u TypeScript fajlovima i automatski prevodio u JavaScript) - u drugom se pozicionirajte unutar
backend
direktorijuma i pokrenitenpm run watch-node
(kako bi se konstantno nadgledao prevedeni JavaScript i restartovao Node.js čim se primeti promena) - u trećem se pozicionirajte unutar
frontend
direktorijuma i pokrenitenpm install
a zatimnpm start
(kako bi se pokrenuo frontend server)
Kad posetite localhost:4200, trebalo bi da vidite frontend i da se pri svakoj izmeni frontend ili backend fajlova oni automatski prevode i pokreću. Ignorišite sve "sigurnosne greške" koje bi npm install
mogao da vam prikaže.