Commit bc008f51 by Dragan Miljkovic

Initial commit

parents
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
This diff is collapsed. Click to expand it.
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Praktikum OOP</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.svenkubiak</groupId>
<artifactId>jBCrypt</artifactId>
<version>0.4.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.sql.ResultSet;
import java.sql.SQLException;
@Controller
public class HomeController {
DataBase DB = new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String userSign = "<a class=\"nav-link\" href=\"login\">Uloguj se</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/")
public String pocetna(@RequestParam(value = "search", defaultValue = "") String search,
@RequestParam(value = "kategorija",defaultValue = "-1") int[] kategorija,
@RequestParam(value = "lokacija",defaultValue = "-1") int[] lokacija,
@RequestParam(value = "skills",defaultValue = "-1") int[] skills,
@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
Model model,
HttpServletResponse response) {
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
model.addAttribute("search",search);
String lista = popuniOglase(search,skills,lokacija,kategorija);
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
String lokacije="";
if(lokacija[0]==-1) {
for (String drzava : DB.vratiListuDrzava()) {
lokacije += "<optgroup label=\"" + drzava + "\">";
lokacije += DB.vratiListuGradova(drzava);
lokacije += "</optgroup>";
}
}
else {
for (String drzava : DB.vratiListuDrzava()) {
lokacije += "<optgroup label=\"" + drzava + "\">";
lokacije += DB.vratiListuGradovaFilter(drzava,lokacija);
lokacije += "</optgroup>";
}
}
if(kategorija[0]!=-1) {
model.addAttribute("kategorija",DB.vratiListuKategorijaFilter(kategorija));
}
else {
model.addAttribute("kategorija",DB.vratiListuKategorija());
}
if(skills[0]!=-1) {
model.addAttribute("skills",DB.vratiListuSkillsFilter(skills));
}
else {
model.addAttribute("skills",DB.vratiListuSkills());
}
model.addAttribute("lokacija", lokacije);
model.addAttribute("poslovi", lista);
return "index";
}
private String popuniOglase(String search,int[] skills,int[] lokacija,int[] kategorija) {
StringBuilder lista = new StringBuilder();
try {
ResultSet rs = DB.popuniListuOglasa(search,skills,lokacija,kategorija);
while (rs.next()) {
Oglas oglas = new Oglas(rs.getInt("oglasID"));
lista.append("<div class=\"posao\">" + "<a href=\"proposal?idOglasa=").append(oglas.getOglasID()).append("\">").append(oglas.getNazivOglasa()).append("</a>").append("<p>").append(oglas.getOpisOglasa()).append("</p>");
for (String skill : oglas.getSkills()) {
lista.append("<div class=\"tag\">").append(skill).append("</div>");
}
lista.append("<div class=\"lokacija\">" + "<img src=\"img/loc.png\" alt=\"lokacija\"> " + "<span>").append(oglas.getLokacija()).append("</span>").append("</div></div>");
}
} catch (SQLException e) {
e.printStackTrace();
}
return lista.toString();
}
@GetMapping("/error")
public String error(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
Model model,
HttpServletResponse response)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
return "error";
}
}
package com.example.demo;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Oglas {
DataBase DB = new DataBase();
private int oglasID;
private int vlasnikID;
private int lokacijaID;
private String lokacija;
private int kategorijaID;
private String kategorija;
private Date datumKreiranja;
private String nazivOglasa;
private String opisOglasa;
private boolean potrebnoIskustvo;
private boolean radOdKuce;
private int brojPregleda;
private int brojLajkova;
private ArrayList<String> skills = new ArrayList<String>();
private ArrayList<String> edukacija = new ArrayList<String>();
Oglas(int oglasID)
{
this.oglasID=oglasID;
String sql="SELECT * FROM oglasi WHERE oglasID="+oglasID;
try {
ResultSet rs = DB.executeCustom(sql);
if(rs.first()) {
vlasnikID = rs.getInt("vlasnikID");
kategorijaID = rs.getInt("kategorijaID");
datumKreiranja = rs.getDate("datumKreiranja");
nazivOglasa = rs.getString("nazivOglasa");
opisOglasa = rs.getString("opisOglasa");
potrebnoIskustvo = rs.getBoolean("iskustvo");
lokacijaID = rs.getInt("lokacijaID");
radOdKuce=rs.getBoolean("radOdKuce");
lokacija = DB.lokacija(lokacijaID);
brojPregleda=DB.brojPregleda(oglasID);
brojLajkova=DB.brojLajkova(oglasID);
skills = DB.vratiSkillsOglas(oglasID);
edukacija = DB.vratiEduOglas(oglasID);
kategorija=DB.kategorija(kategorijaID);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int getBrojLajkova() {
return brojLajkova;
}
public boolean isRadOdKuce() {
return radOdKuce;
}
public int getBrojPregleda() {
return brojPregleda;
}
public ArrayList<String> getEdukacija() {
return edukacija;
}
public ArrayList<String> getSkills() {
return skills;
}
public int getOglasID() {
return oglasID;
}
public int getVlasnikID() {
return vlasnikID;
}
public int getLokacijaID() {
return lokacijaID;
}
public String getLokacija() {
return lokacija;
}
public int getKategorijaID() {
return kategorijaID;
}
public String getKategorija() {
return kategorija;
}
public Date getDatumKreiranja() {
return datumKreiranja;
}
public String getNazivOglasa() {
return nazivOglasa;
}
public String getOpisOglasa() {
return opisOglasa;
}
public boolean isPotrebnoIskustvo() {
return potrebnoIskustvo;
}
}
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PraktikumOopApplication {
public static void main(String[] args)
{
SpringApplication.run(PraktikumOopApplication.class, args);
DataBase DB = new DataBase();
//DB.kreirajPocetnuBazu();
}
}
package com.example.demo;
import org.mindrot.jbcrypt.BCrypt;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Base64;
public class Security {
public static String encryptCookie(String plain) {
String b64encoded = Base64.getEncoder().encodeToString(plain.getBytes());
String reverse = new StringBuffer(b64encoded).reverse().toString();
StringBuilder tmp = new StringBuilder();
final int OFFSET = 4;
for (int i = 0; i < reverse.length(); i++) {
tmp.append((char)(reverse.charAt(i) + OFFSET));
}
return tmp.toString();
}
public static String decryptCookie(String secret) {
StringBuilder tmp = new StringBuilder();
final int OFFSET = 4;
for (int i = 0; i < secret.length(); i++) {
tmp.append((char)(secret.charAt(i) - OFFSET));
}
String reversed = new StringBuffer(tmp.toString()).reverse().toString();
return new String(Base64.getDecoder().decode(reversed));
}
public static String generatePassword(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt(12));
}
public static boolean matchPassword(String password, String hashedPassword) {
return BCrypt.checkpw(password, hashedPassword);
}
public static boolean proveriCookies(int role, int id, HttpServletResponse response) {
if (role == -1 || id == -1) {
// create a cookie
Cookie cookieid = new Cookie("id", encryptCookie("0"));
Cookie cookierole = new Cookie("role", encryptCookie("0"));
cookieid.setPath("/");
cookierole.setPath("/");
// add cookie to response
response.addCookie(cookieid);
response.addCookie(cookierole);
return true;
}
return false;
}
}
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
@Controller
public class TablaController {
DataBase DB=new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/inbox")
public String oglasnaTabla(@CookieValue("id") String cookieId, @CookieValue("role") String cookieRole, HttpServletResponse response, Model model)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
return "redirect:error";
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
if(role==1) {
model.addAttribute("popuni",DB.popuniInfoInboxKorisnik(id));
}
if(role==2) {
model.addAttribute("popuni",DB.popuniInfoInboxPoslodavac(id));
}
if(role==3)
{
model.addAttribute("popuni",DB.popuniInfoInboxKorisnik(id)+DB.popuniInfoInboxPoslodavac(id));
}
return "oglasnaTabla";
}
@GetMapping("/dismissUser")
public String dismissKorisnik(@RequestParam("id") int id)
{
DB.dismissUser(id);
return "redirect:inbox";
}
@GetMapping("/dismissPoslodavac")
public String dismissPoslodavac(@RequestParam("id") int id)
{
DB.dismissPoslodavac(id);
return "redirect:inbox";
}
@GetMapping("/accept")
public String accept(@RequestParam("id") int id)
{
DB.accept(id);
return "redirect:inbox";
}
@GetMapping("/decline")
public String decline(@RequestParam("id") int id)
{
DB.decline(id);
return "redirect:inbox";
}
}
package com.example.demo;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class User {
DataBase DB = new DataBase();
private int korisnikID;
private String ime;
private String prezime;
private String datumRodjenja;
private String email;
private boolean pol;
private String mobilni;
private String slikaUrl;
private String bio;
private int lokacijaID;
private String lokacija;
private int tipKorisnika;
private ArrayList<String> skills = new ArrayList<String>();
private ArrayList<String> edukacija = new ArrayList<String>();
public User(int korisnikID) {
this.korisnikID=korisnikID;
try {
ResultSet rs = DB.executeCustom("SELECT * FROM korisnik WHERE korisnikID=" + korisnikID);
if(rs.first())
{
ime=rs.getString("ime");
prezime=rs.getString("prezime");
datumRodjenja=rs.getString("datumRodjenja");
email=rs.getString("email");
pol=rs.getBoolean("pol");
lokacijaID=rs.getInt("lokacijaID");
tipKorisnika=rs.getInt("tipKorisnika");
mobilni=rs.getString("mobilni");
slikaUrl=rs.getString("profilnaSlikaURL");
bio=rs.getString("bio");
lokacija=DB.lokacija(lokacijaID);
skills = DB.vratiSkillsKorisnik(korisnikID);
edukacija = DB.vratiEduKorisnik(korisnikID);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public ArrayList<String> getSkills() {
return skills;
}
public int getKorisnikID() {
return korisnikID;
}
public String getIme() {
return ime;
}
public String getPrezime() {
return prezime;
}
public String getDatumRodjenja() {
return datumRodjenja;
}
public String getEmail() {
return email;
}
public boolean isPol() {
return pol;
}
public String getMobilni() {
return mobilni;
}
public String getSlikaUrl() {
return slikaUrl;
}
public String getBio() {
return bio;
}
public int getLokacijaID() {
return lokacijaID;
}
public ArrayList<String> getEdukacija() {
return edukacija;
}
public String getLokacija() {
return lokacija;
}
public int getTipKorisnika() {
return tipKorisnika;
}
}
.input-hidden {
position: absolute;
left: -9999px;
}
input[type=radio]:checked + label>img {
border: 1px solid #fff;
box-shadow: 0 0 3px 3px #090;
}
/* Stuff after this is only to make things more pretty */
input[type=radio] + label>img {
border: 1px dashed #444;
width: 80px;
height: 80px;
transition: 500ms all;
}
input[type=radio]:checked + label>img {
transform:
rotateZ(-10deg)
rotateX(10deg);
}
/*
| //lea.verou.me/css3patterns
| Because white bgs are boring.
*/
html {
background-color: #fff;
background-size: 100% 1.2em;
background-image:
linear-gradient(
90deg,
transparent 79px,
#abced4 79px,
#abced4 81px,
transparent 81px
),
linear-gradient(
#eee .1em,
transparent .1em
);
}
\ No newline at end of file
.icon-select{
width:0px;
}
.icon-select .selected-box {
position: relative;
margin: 0px;
padding: 0px;
width: 70px;
height: 60px;
border: 1px solid #999999;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .selected-box:hover {
position: relative;
margin: 0px;
padding: 0px;
width: 70px;
height: 60px;
border: 1px solid #000000;
background-color: #FFFFFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .selected-icon {
position: absolute;
margin: 0px;
padding: 0px;
top:5px;
left:5px;
width: 48px;
height: 48px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .component-icon{
position: absolute;
bottom:5px;
right:4px;
}
.icon-select .box {
position: absolute;
top:0px;
left:71px;
margin: 0px;
padding: 0px;
width: 170px;
height: 170px;
border: 1px solid #EEEEEE;
background-color: #EEEEEE;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:auto;
}
.icon-select .icon {
position: relative;
margin: 5px 0px 0px 5px;
padding: 0px;
width: 48px;
height: 48px;
border: 1px solid #CCCCCC;
background-color: #FFFFFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:hidden;
float: left;
}
.icon-select .icon:hover {
border: 1px solid #000000;
}
.icon-select .icon.selected {
position: relative;
margin: 5px 0px 0px 5px;
padding: 0px;
width: 48px;
height: 48px;
border: 1px solid #EEEEEE;
background-color: #EEEEEE;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:hidden;
float: left;
}
\ No newline at end of file
body{
background-color: lightgrey;
}
#poslovi{
margin: 10px 0px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
.posao{
border-top: graytext 1px solid;
padding: 5px;
}
.posao a{
font-size: 20px;
color: darkslategrey;
text-decoration: none;
font-weight: bold;
}
.posao a:hover{
color: darkgray;
}
.posao p{
color: gray;
}
.tag{
float: left;
padding: 2px;
background-color: lightgrey;
border-radius: 5px;
margin: 3px;
padding: 3px;
}
.rejting,.lokacija{
clear: both;
padding: 5px;
}
.lokacija img{
width: 20px;
}
#search{
padding: 10px;
}
#main{
margin-top: 10px;
}
.accordion, .accordion-body, .accordion-button, .accordion-collapse, .accordion-header, .accordion-item{
background-color: lightgray;
border: none;
}
.accordion-button{
border-top: gray 1px solid;
}
.accordion-collapse:active{
background-color: lightgray;
}
\ No newline at end of file
.ms-parent {
display: inline-block;
position: relative;
vertical-align: middle;
}
.ms-choice {
display: block;
width: 100%;
height: 26px;
padding: 0;
overflow: hidden;
cursor: pointer;
border: 0px solid #aaa;
text-align: left;
white-space: nowrap;
line-height: 26px;
color: #444;
text-decoration: none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
background-color: #fff;
}
.ms-choice.disabled {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.ms-choice > span {
position: absolute;
top: 0;
left: 0;
right: 20px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
padding-left: 8px;
}
.ms-choice > span.placeholder {
color: #999;
}
.ms-choice > div {
position: absolute;
top: 0;
right: 0;
width: 20px;
height: 25px;
background: url('img/multiple-select.png') left top no-repeat;
}
.ms-choice > div.open {
background: url('img/multiple-select.png') right top no-repeat;
}
.ms-drop {
width: 100%;
overflow: hidden;
display: none;
margin-top: -1px;
padding: 0;
position: absolute;
z-index: 1000;
background: #fff;
color: #000;
border: 1px solid #aaa;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.ms-drop.bottom {
top: 100%;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
}
.ms-drop.top {
bottom: 100%;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
.ms-search {
display: inline-block;
margin: 0;
min-height: 26px;
padding: 4px;
position: relative;
white-space: nowrap;
width: 100%;
z-index: 10000;
}
.ms-search input {
width: 100%;
height: auto !important;
min-height: 24px;
padding: 0 20px 0 5px;
margin: 0;
outline: 0;
font-family: sans-serif;
font-size: 1em;
border: 1px solid #aaa;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
background: #fff url('img/multiple-select.png') no-repeat 100% -22px;
background: url('img/multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
background: url('img/multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
}
.ms-search, .ms-search input {
-webkit-box-sizing: border-box;
-khtml-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.ms-drop ul {
overflow: auto;
margin: 0;
padding: 5px 8px;
}
.ms-drop ul > li {
list-style: none;
display: list-item;
background-image: none;
position: static;
}
.ms-drop ul > li .disabled {
opacity: .35;
filter: Alpha(Opacity=35);
}
.ms-drop ul > li.multiple {
display: block;
float: left;
}
.ms-drop ul > li.group {
clear: both;
}
.ms-drop ul > li.multiple label {
width: 100%;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ms-drop ul > li label {
font-weight: normal;
display: block;
white-space: nowrap;
}
.ms-drop ul > li label.optgroup {
font-weight: bold;
}
.ms-drop input[type="checkbox"] {
vertical-align: middle;
}
.ms-drop .ms-no-results {
display: none;
}
body{
background-color: lightgrey;
}
.tag{
float: left;
padding: 2px;
background-color: lightgrey;
border-radius: 5px;
margin: 3px;
padding: 3px;
}
.rejting,.lokacija{
clear: both;
padding: 5px;
}
#proposalBorderLine{
border-left: gray 1px solid;
margin-bottom: 10px;
}
#userBorderLine{
border-right: gray 1px solid;
margin-bottom: 10px;
}
h3 {
padding: 10px;
}
#main{
margin-top: 10px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
#tagovi{
padding-bottom: 10px;
}
#postavljeno, #postavio{
clear: both;
font-size: 15px;
color: graytext;
}
#info{
margin-top: 15px;
}
#prijava{
margin-top: 10px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
#poruka{
border-right: gray 1px solid;
margin-bottom: 10px;
}
.userHeader {
display: flex;
padding-top: 2%;
padding-bottom: 2%;
justify-content: space-between;
}
.userHeader > button {
align-self: center;
padding: 1% 3% 1% 3%;
margin-right: 5%;
}
.userHeaderInfo {
display: flex;
margin-left: 3%;
align-items: center;
}
.userImg {
border-radius: 100%;
height: 100px;
width: auto;
}
.userName {
margin-left: 10%;
}
.userName > img {
width: 30px;
}
document.querySelector('#username').addEventListener('blur', validateUsername);
document.querySelector('#password').addEventListener('blur', validatePassword);
document.querySelector('#email').addEventListener('blur', validateEmail);
document.querySelector('#korisnikMob').addEventListener('blur', validateMob);
document.querySelector('#korisnikRodjen').addEventListener('blur', validateRodjen);
document.querySelector('#korisnikIme').addEventListener('blur', validateIme);
document.querySelector('#korisnikPrezime').addEventListener('blur', validatePrezime);
document.querySelector('#korisnikBio').addEventListener('blur', validateBio);
const notEmpty = /.{1,255}/;
const removeSpaces = /^\S*$/;
// - can not have spaces
function validateUsername(e) {
const idContainer = document.querySelector('#username');
const re = /^([A-Za-z0-9]){4,20}$/;
// - Value must be from 4 to 20 characters in length,
// - only allow letters and numbers, no special characters,
// - full line is evaluated.
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validatePassword(e) {
const re = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/;
// - at least 8 characters
// - must contain at least 1 uppercase letter, 1 lowercase letter, and 1 number
// - Can contain special characters
const idContainer = document.querySelector('#password');
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateEmail(e) {
const re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
// - Email Validation as per RFC2822 standards.
// - Straight from .net helpfiles :)
const idContainer = document.querySelector('#email');
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateMob(e) {
const re = /^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/;
// - Positive: +42 555.123.4567 +1-(800)-123-4567 +7 555 1234567 +7(926)1234567
// - (926) 1234567 +79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 123
const idContainer = document.querySelector('#korisnikMob');
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateRodjen(e) {
const re = /([\d]+)([\-\./])([\d]+)([\-\./])([\d]+)|((Jan(|uary)|Feb(|ruary)|Mar(|ch)|Apr(|il)|May|Jun(|e)|Jul(|y)|Aug(|ust)|Sept(|ember)|Oct(|ober)|(Nov|Dec)(|ember))([\s\-])(|([\d]+){1,2}([\s\-]|\, ))([\d]+){4})/;
// - Date formatting in these formats:
// - 01-01-2011
// - 01/01/2011
// - Jan 1, 2011
// - Jan 01, 2011
const idContainer = document.querySelector('#korisnikRodjen');
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateIme(e) {
const idContainer = document.querySelector('#korisnikIme');
if (notEmpty.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validatePrezime(e) {
const idContainer = document.querySelector('#korisnikPrezime');
if (notEmpty.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateBio(e) {
const idContainer = document.querySelector('#korisnikBio');
const re = /.{1,2000}/;
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
(function () {
const forms = document.querySelectorAll('.needs-validation');
for (let form of forms) {
form.addEventListener(
'submit',
function (event) {
if (
!validateUsername() ||
!validatePassword() ||
!validateEmail() ||
!validateMob() ||
!validateRodjen() ||
!validateIme() ||
!validatePrezime() ||
!validateBio()
) {
event.preventDefault();
event.stopPropagation();
} else {
// form.classList.add('was-validated');
}
},
false
);
}
})();
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<br>
<br>
<div class="text-center">
<img src="img/error404.png" class="rounded" alt="...">
</div>
<h1 class="display-1 text-center">Oops!!</h1>
<blockquote class="blockquote text-center">
<p class="mb-0">Ne možemo da pronađemo stranicu koju tražite.</p>
<br>
<footer class="blockquote-footer">Error code: <cite title="Source Title">404</cite></footer>
</blockquote>
<br>
<br>
<h2 class="lead text-center">Vrati se na početnu stranicu:</h2>
<div class="text-center">
<a type="button" class="btn btn-primary" href="/">Početna</a>
</div>
<br><br>
</div>
<br>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/index.css">
<link rel="stylesheet" href="css/multiple-select.css" />
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div id="filteri" class="col-sm-12 col-lg-4">
<!-- filteri -->
<form method="GET" action="/">
<h4 class="h4">Filtriraj po</h4>
<div class="accordion" id="accordionPanelsStayOpenExample">
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingOne">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseOne" aria-expanded="true"
aria-controls="panelsStayOpen-collapseOne">
Kategorija
</button>
</h2>
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingOne">
<div class="accordion-body">
<select class="form-control ms" multiple="multiple" id="korisnikUloga" name="kategorija" th:utext="${kategorija}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingTwo">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseTwo" aria-expanded="false"
aria-controls="panelsStayOpen-collapseTwo">
Lokacija
</button>
</h2>
<div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingTwo">
<div class="accordion-body">
<select class="form-control ms" multiple="multiple" id="lokacija" name="lokacija" th:utext="${lokacija}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingThree">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseThree" aria-expanded="false"
aria-controls="panelsStayOpen-collapseThree">
Vestine
</button>
</h2>
<div id="panelsStayOpen-collapseThree" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingThree">
<div class="accordion-body">
<select name="skills" multiple="multiple" class="form-control ms" th:utext="${skills}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
</div>
</div><!-- kraj filtera -->
<div id="poslovi" class="col-sm-12 col-lg-8">
<!-- poslovi -->
<div id="search">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search" name="search" th:value="${search}">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
<div th:utext="${poslovi}"/>
</div><!-- kraj poslova -->
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<!-- Multiple Select -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="jss/multiple-select.js"></script>
<script>
$(function () {
$('.ms').change(function () {
console.log($(this).val());
}).multipleSelect({
width: '100%'
});
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="login">Uloguj se</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<h1 class="display-2">Prijava</h1>
<form id="forms" method="POST" class="needs-validation" novalidate action="login">
<br>
<div class="form-group col-md-6">
<label for="username">Username</label>
<input type="txt" class="form-control" id="username" name="username" placeholder="Username"
required th:value="${username}">
<div class="invalid-feedback">Molimo Vas, unesite validno korisničko ime.<br>Username može imati od 4 do
20 karaktera,
dozvoljena su slova i brojevi, nisu dozvoljeni specijalni karakteri kao i razmak.</div>
<div class="valid-feedback">Odlično!</div>
<!-- <small id="passowrdHelp" class="form-text text-muted">Username može imati od 4 do 20 karaktera,
dozvoljena su slova i brojevi, nisu dozvoljeni specijalni karakteri kao i razmak. </small> -->
</div>
<br>
<div class="form-group col-md-6">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password"
required>
<div class="invalid-feedback">Molimo Vas, unesite validnu lozinku.<br>Lozinka mora imati najmanje 8
karaktera, 1
veliko slovo, 1 malo slovo
i 1 broj, može da sadrži specijalne karaktere. Nije dozvoljen razmak.</div>
<div class="valid-feedback">Odlično!</div>
<!-- <small id="passowrdHelp" class="form-text text-muted">Lozinka mora imati najmanje 8 karaktera, 1
veliko slovo, 1 malo slovo
i 1 broj, može da sadrži specijalne karaktere. Nije dozvoljen razmak.</small> -->
</div>
<br>
<button type="submit" class="btn btn-success col-md-2">Prijavi Se</button>
</form>
<br>
<a class="a" href="register">Nemate nalog? Napravite novi!</a>
<br>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}" />
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}" />
<li class="nav-item" th:utext="${user}" />
</ul>
</div>
</div>
</nav>
<div id="main" class="container justify-content-center">
<br>
<div id="poslovi" class="col-sm col-lg" th:utext="${popuni}"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div class="userHeader">
<h3 class="h3">Detalji o poslu</h3>
<div th:utext="${dugmeChange}"/>
<div th:utext="${dugme}"/>
<div th:utext="${lajk}"/>
</div><hr>
<div class="col-lg-8">
<h4 id="naslov" class="h4" th:text="${nazivOglasa}"/>
<div class="tag" id="kategorija" th:text="${kategorijaID}"/>
<div>
Broj pregleda: <span th:text="${brojPregleda}"/>
</div>
<div id="postavljeno">
Postavljeno: <span th:text="${datumKreiranja}"/>
</div>
<div id="postavio">
Postavio: <span th:utext="${nazivVlasnika}"/>
</div>
<p id="info" th:text="${opisOglasa}"/>
</div>
<div id="proposalBorderLine" class="col-lg-4">
<h6 class="h6" th:text="${potrebnoIskustvo}"/>
<h6 class="h6" th:text="${radOdKuce}"/>
<div class="lokacija">
<img src="img/loc.png" style="width: 20px;" alt="lokacija"> <span th:text="${lokacija}"/>
</div>
Potrebno obrazovanje:
<div class="lokacija" th:utext="${obrazovanje}"/>
</div>
<hr>
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi" th:utext="${skills}"/>
</div>
</div>
<!-- prijava container -->
<div th:utext="${prijava}">
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
<!-- Multiple Select Plugin -->
<link rel="stylesheet" href="css/multiple-select.css" />
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="dodajOglas">Dodaj oglas</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="inbox">Inbox</a>
</li>
<li class="nav-item">
<a class="nav-link" href="user">Moj profil</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<h1 class="display-2" th:text="${naziv}"/>
<form id="forms" method="POST" class="needs-validation" novalidate th:action="${akcija}">
<!-- action = "naziv-action-php-fajla.php" -->
<br>
<div class="form-group col-md-5">
<label for="korisnikUloga">Kategorija</label>
<select class="form-control" id="korisnikUloga" name="kategorija" th:utext="${kategorija}"/>
</div>
<br>
<div class="form-group col-md-5">
<label for="nazivOglasa">Naziv</label>
<input type="txt" class="form-control" id="nazivOglasa" name="nazivOglasa" placeholder="Naziv Oglasa"
required th:value="${nazivOglasa}">
<div class="invalid-feedback">Molimo Vas, unesite naziv oglasa. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<br>
<div class="form-group col-md-5">
<label for="opisOglasa">Detalji</label>
<textarea class="form-control" id="opisOglasa" name="opisOglasa"
placeholder="Detalji posla, do 2000 karaktera" rows=6 required th:text="${opisOglasa}"></textarea>
<div class="invalid-feedback">>Molimo Vas, unesite detalje posla. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<br>
<div class="form-group col-md-5">
<label for="ms">Vestine</label>
<select name="skills" multiple="multiple" class="form-control ms" th:utext="${skills}">
</select>
</div>
<br>
<div class="form-group col-md-5">
<label for="ms">Edukacija</label>
<select name="edukacija" multiple="multiple" class="form-control ms" th:utext="${edukacija}"/>
</div>
<br>
<div class="form-group col-md-5">
<label for="lokacija">Lokacija</label>
<select class="form-control" id="lokacija" name="lokacija" th:utext="${lokacija}"/>
</div>
<br>
<legend class="col-form-label ">Da li je potrebno iskustvo?</legend>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="iskustvo" id="iskustvoDa" value="1" th:checked="${iskustvoDa}">
<label class="form-check-label" for="iskustvoDa">Da</label>
</div>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="iskustvo" id="iskustvoNe" value="0" th:checked="${iskustvoNe}">
<label class="form-check-label" for="iskustvoNe">Ne</label>
</div>
<br>
<legend class="col-form-label ">Da li je moguć rad od kuće?</legend>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="radOdKuce" id="radOdKuceDa" value="1" th:checked="${radOdKuceDa}">
<label class="form-check-label" for="radOdKuceDa">Da</label>
</div>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="radOdKuce" id="radOdKuceNe" value="0" th:checked="${radOdKuceNe}">
<label class="form-check-label" for="radOdKuceNe">Ne</label>
</div>
<br>
<br>
<button type="submit" class="btn btn-success col-md-2" th:text="${dugme}"/>
<div th:utext="${odustani}"/>
<br>
<br>
<br>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
<!-- Multiple Select -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="jss/multiple-select.js"></script>
<script>
$(function () {
$('.ms').change(function () {
console.log($(this).val());
}).multipleSelect({
width: '100%'
});
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div class="userHeader">
<div class="userHeaderInfo">
<img class="userImg" th:src="${avatar}" alt="avatar">
<div class="userName">
<h3 class="h3"th:text="${ime}"/>
<img src="img/loc.png" alt="lokacija"> <span th:text="${lokacija}"/>
</div>
</div>
<div th:utext="${dugmeChange}"/>
<div th:utext="${dugme}"/>
</div>
</div>
<hr>
<div class="row">
<div id="userBorderLine" class="col-lg-2">
<h5 class="h5">Edukacija</h5>
<div th:utext="${edukacija}"/>
</div>
<!-- dodati atribut o korisniku -->
<div class="col-lg-10">
<h4 id="naslov" class="h4">O korisniku:</h4>
<p id="info" th:utext="${opis}"/>
</div>
<hr>
</div>
<div class="row">
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi" th:utext="${skills}"/>
</div>
<div><h6 class="h6">Email: </h6><p th:text="${email}"/></div>
<div><h6 class="h6">Broj tel: </h6><p th:text="${broj}"/></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Praktikum OOP</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="Projekat/css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="index.html">Praktikum OOP</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="index.html">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Inbox</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Moj profil</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<h3 class="h3">Uredi profil</h3>
<hr>
<div class="mb-3 row">
<label for="inputPassword" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword">
</div>
<label for="exampleFormControlTextarea1" class="form-label">Example textarea</label>
<textarea class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea>
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi">
<div class="tag">
Java
</div>
<div class="tag">
C#
</div>
<div class="tag">
Photoshop
</div>
<div class="tag">
Game Dev
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PraktikumOopApplicationTests {
@Test
void contextLoads() {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment