ПИА/Јануар 2022

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Испит у јануарском испитном року 2022. године одржан је 21. јануара. Било је могуће радити у Јава Сервер Фацес или Ангулар и Ноде.јс технологијама, од чега је за први колоквијум била Јава Сервер Фацес а за други Ангулар и Ноде.јс технологије. Поставка задатка је била иста за оба колоквијума. Сваки колоквијум је трајао 2 сата, док ако се раде оба то траје 3 сата. На страници предмета доступан је текст задатка као и базе података за МyСQЛ и МонгоДБ.

Поставка

Направити следећу мини интернет апликацију за пицерију.

На почетној страни апликације, направити ХТМЛ форму, преко које могу да се пријављују корисници система, а то су купци и радници. Корисници треба да имају могућност уношења корисничког имена и лозинке и да помоћу радио дугмета одаберу: да ли се пријављују у систем као купци или радници. У случају исправно унетих података, кориснику треба омогућити рад са остатком система (за сваки тип треба приказати посебну почетну страницу након пријављивања). Уколико корисник не унесе неки од података или унесе погрешне податке, потребно је исписати поруку грешке црвеним словима са могућношћу исправљања грешке. По успешној пријави у систем, кориснику дати и опцију да се одјави. [7 поена]

Купац након пријаве на систем види своје информације (име и презиме) и табеларни приказ својих наруџбина (идентификатор, величину пице, називе додатака и статус наруџбине). [4 поена] Испод табеларног приказа налази се форма за наручивање пице. Корисник из падајуће листе бира величину пице (фиксни подаци: мала, средња, велика). Испод одабира величине бирају се додаци за пицу, путем низа цхецкбоx-ова. Сваки додатак је један цхецкбоx, који је онемогућен (дисаблед) уколико додатка нема на стању. Приказати назив и количину додатка. [6 поена] Кликом на дугме "Потврди" наруџбина се додаје у базу са статусом "нова" (може да се не одабере ниједан додатак). Након додавања наруџбине треба освежити страницу. [3 поена]

Радник након пријаве на систем види табеларни приказ свих наруџбина у систему. [2 поена] Поред нових наруџбина у систему (статус "нова") треба приказати дугмад за прихватање или одбијање те наруџбине (прихваћене наруџбине имају статус "прихвацена", одбијене имају статус "одбијена"), чиме се мења статус поруџбине. [5 поена] Прихватање наруџбине подразумева да се и ажурира количина сваког одабраног додатка (смањи за 1). Одбијање нема утицаја на количину. Након промене статуса, освежити страницу. [3 поена] Испод табеле са наруџбинама налази се табела са свим додацима помоћу које се може допунити и њихово стање. Табела треба да садржи назив додатка, тренутну количину производа на стању и дугме за наручивање тог додатка. Кликом на дугме за наручивање се аутоматски увећава количина на стању за 5. [3 поена] Додаци којих нема на стању треба да буду обојени црвеном бојом. [2 поена]

Решење

Јава Сервер Фацес

Странице

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>

Зрна

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";
    }
    
    
}

Ентитети

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;
    }
    
}

Утил.ДАО

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));
        }
    }
}

Ангулар и Ноде.јс

Решење се може преузети као ЗИП архива. Како бисте га покренули:

  1. увезите колекције из ЈСОН фајлова у local базу унутар МонгоДБ
  2. отворите три терминала
  3. у једном се позиционирајте унутар backend директоријума, покрените npm install а затим npm run watch-ts директоријума (како би се константно надгледао фајл систем за промене у ТyпеСцрипт фајловима и аутоматски преводио у ЈаваСцрипт)
  4. у другом се позиционирајте унутар backend директоријума и покрените npm run watch-node (како би се константно надгледао преведени ЈаваСцрипт и рестартовао Ноде.јс чим се примети промена)
  5. у трећем се позиционирајте унутар frontend директоријума и покрените npm install а затим npm start (како би се покренуо фронтенд сервер)

Кад посетите лоцалхост:4200, требало би да видите фронтенд и да се при свакој измени фронтенд или бацкенд фајлова они аутоматски преводе и покрећу. Игноришите све "сигурносне грешке" које би npm install могао да вам прикаже.