Merge branch 'testing' into main
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -3,6 +3,9 @@ target/
|
|||||||
!.mvn/wrapper/maven-wrapper.jar
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
!**/src/main/**/target/
|
!**/src/main/**/target/
|
||||||
!**/src/test/**/target/
|
!**/src/test/**/target/
|
||||||
|
Databases/
|
||||||
|
logs/
|
||||||
|
Results/
|
||||||
|
|
||||||
### STS ###
|
### STS ###
|
||||||
.apt_generated
|
.apt_generated
|
||||||
|
|||||||
1691
Databases/First Voting/VotingSystem.sql
Normal file
1691
Databases/First Voting/VotingSystem.sql
Normal file
File diff suppressed because it is too large
Load Diff
1424
Databases/Second Voting/VotingSystem.sql
Normal file
1424
Databases/Second Voting/VotingSystem.sql
Normal file
File diff suppressed because it is too large
Load Diff
3989
logs/Voting.log
3989
logs/Voting.log
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,6 @@ import com.github.cato447.AbizeitungVotingSystem.helper.RandomNumber;
|
|||||||
import com.github.cato447.AbizeitungVotingSystem.repositories.*;
|
import com.github.cato447.AbizeitungVotingSystem.repositories.*;
|
||||||
import com.github.cato447.AbizeitungVotingSystem.table.TableAction;
|
import com.github.cato447.AbizeitungVotingSystem.table.TableAction;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.mail.SimpleMailMessage;
|
import org.springframework.mail.SimpleMailMessage;
|
||||||
import org.springframework.mail.javamail.JavaMailSender;
|
import org.springframework.mail.javamail.JavaMailSender;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
@@ -19,22 +18,15 @@ import org.apache.logging.log4j.LogManager;
|
|||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
public class VotingController {
|
public class VotingController {
|
||||||
|
|
||||||
|
private boolean votingPhase;
|
||||||
@Value("motto")
|
private boolean addingPhase;
|
||||||
String motto;
|
|
||||||
@Value("adding")
|
|
||||||
String adding;
|
|
||||||
@Value("voting")
|
|
||||||
String voting;
|
|
||||||
|
|
||||||
private boolean votingPhase = false;
|
|
||||||
private boolean mottoPhase = false;
|
|
||||||
private boolean addingPhase = false;
|
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(VotingController.class);
|
private static final Logger LOGGER = LogManager.getLogger(VotingController.class);
|
||||||
private TableAction tableAction = new TableAction();
|
private TableAction tableAction = new TableAction();
|
||||||
@@ -48,9 +40,6 @@ public class VotingController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
CategoryRepository categoryRepository;
|
CategoryRepository categoryRepository;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
MottoRepository mottoRepository;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
PossibleCandidateRepository possibleCandidateRepository;
|
PossibleCandidateRepository possibleCandidateRepository;
|
||||||
|
|
||||||
@@ -63,21 +52,10 @@ public class VotingController {
|
|||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
if (motto != null){
|
votingPhase = true;
|
||||||
mottoPhase = true;
|
addingPhase = false;
|
||||||
} else if (adding != null){
|
|
||||||
addingPhase = true;
|
|
||||||
} else if (voting != null){
|
|
||||||
votingPhase = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
LOGGER.info("Program started with arguments: votingPhase="+ votingPhase + " addingPhase=" + addingPhase);
|
||||||
// //TODO: TESTING REMOVE ON SHIPPING
|
|
||||||
// votingPhase = false;
|
|
||||||
// mottoPhase = true;
|
|
||||||
// addingPhase = false;
|
|
||||||
|
|
||||||
LOGGER.info("Program started with arguments: votingPhase="+ votingPhase + " mottoPhase=" + mottoPhase + " addingPhase=" + addingPhase);
|
|
||||||
|
|
||||||
if (voterRepository.findAll().size() == 0) {
|
if (voterRepository.findAll().size() == 0) {
|
||||||
tableAction.setUpVoters(voterRepository);
|
tableAction.setUpVoters(voterRepository);
|
||||||
@@ -86,14 +64,10 @@ public class VotingController {
|
|||||||
|
|
||||||
if (categoryRepository.findAll().size() == 0) {
|
if (categoryRepository.findAll().size() == 0) {
|
||||||
tableAction.setUpCategories(categoryRepository);
|
tableAction.setUpCategories(categoryRepository);
|
||||||
|
possibleCandidateRepository.deleteAll();
|
||||||
LOGGER.info("Categories successfully set up");
|
LOGGER.info("Categories successfully set up");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mottoRepository.findAll().size() == 0){
|
|
||||||
tableAction.setUpMottos(mottoRepository);
|
|
||||||
LOGGER.info("Mottos successfully set up");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (candidateRepository.findAll().size() == 0 && votingPhase == true && possibleCandidateRepository.findAll().size() != 0) {
|
if (candidateRepository.findAll().size() == 0 && votingPhase == true && possibleCandidateRepository.findAll().size() != 0) {
|
||||||
tableAction.setUpCandidates(possibleCandidateRepository, candidateRepository);
|
tableAction.setUpCandidates(possibleCandidateRepository, candidateRepository);
|
||||||
LOGGER.info("Candidates successfully set up");
|
LOGGER.info("Candidates successfully set up");
|
||||||
@@ -102,7 +76,16 @@ public class VotingController {
|
|||||||
|
|
||||||
@RequestMapping("/")
|
@RequestMapping("/")
|
||||||
public String WelcomeSite() {
|
public String WelcomeSite() {
|
||||||
return "start.html";
|
LocalDate finishDate = LocalDate.of(2021, Month.JANUARY,24);
|
||||||
|
LocalDate now = LocalDate.now();
|
||||||
|
|
||||||
|
if(now.isAfter(finishDate)){
|
||||||
|
LOGGER.warn("passed");
|
||||||
|
return "errors/votingClosed.html";
|
||||||
|
} else {
|
||||||
|
LOGGER.warn("in Bounds");
|
||||||
|
return "start.html";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendSimpleMessage(String to, String subject, String text) {
|
public void sendSimpleMessage(String to, String subject, String text) {
|
||||||
@@ -119,18 +102,18 @@ public class VotingController {
|
|||||||
try {
|
try {
|
||||||
LOGGER.warn(name);
|
LOGGER.warn(name);
|
||||||
Voter voter = voterRepository.findByEmail(name.toLowerCase().strip());
|
Voter voter = voterRepository.findByEmail(name.toLowerCase().strip());
|
||||||
|
if (voter == null){
|
||||||
|
LOGGER.error(name + " is not allowed to vote");
|
||||||
|
return "errors/notRegistered.html";
|
||||||
|
}
|
||||||
if (voter.getVote_status() && votingPhase) {
|
if (voter.getVote_status() && votingPhase) {
|
||||||
LOGGER.warn(name + " has already voted");
|
LOGGER.warn(name + " has already voted");
|
||||||
return "errors/alreadyVoted.html";
|
return "errors/alreadyVoted.html";
|
||||||
} else if (voter.getCandidatesubmit_status() && addingPhase) {
|
} else if (voter.getCandidatesubmit_status() && addingPhase) {
|
||||||
LOGGER.warn(name + " has already submitted its candidates");
|
LOGGER.warn(name + " has already submitted its candidates");
|
||||||
return "errors/alreadysubmittedcandidates.html";
|
return "errors/alreadyVoted.html";
|
||||||
} else if (voter.getMotto_status() && mottoPhase) {
|
|
||||||
LOGGER.warn(name + " has already chose their motto");
|
|
||||||
return "errors/alreadyVotedForMotto.html";
|
|
||||||
} else {
|
} else {
|
||||||
if (authCodesRepository.findByName(name) == null) {
|
if (authCodesRepository.findByName(name) == null) {
|
||||||
LOGGER.warn("no code");
|
|
||||||
AuthCode authCode = tableAction.generateToken(name, RandomNumber.getRandomNumberString(), authCodesRepository);
|
AuthCode authCode = tableAction.generateToken(name, RandomNumber.getRandomNumberString(), authCodesRepository);
|
||||||
sendSimpleMessage(name, "Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode());
|
sendSimpleMessage(name, "Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode());
|
||||||
} else if (authCodesRepository.findByName(name) != null && authCodesRepository.findByName(name).isExpired()) {
|
} else if (authCodesRepository.findByName(name) != null && authCodesRepository.findByName(name).isExpired()) {
|
||||||
@@ -138,32 +121,38 @@ public class VotingController {
|
|||||||
sendSimpleMessage(name, "Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode());
|
sendSimpleMessage(name, "Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode());
|
||||||
}
|
}
|
||||||
model.addAttribute("name", name);
|
model.addAttribute("name", name);
|
||||||
|
model.addAttribute("codeTime", authCodesRepository.findByName(name).getExpirationTime());
|
||||||
model.addAttribute("codeExpired", false);
|
model.addAttribute("codeExpired", false);
|
||||||
model.addAttribute("codeFalse", false);
|
model.addAttribute("codeFalse", false);
|
||||||
return "authenticate.html";
|
return "authenticate.html";
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
LOGGER.error(name + " is not allowed to vote");
|
tableAction.deleteToken(name, authCodesRepository);
|
||||||
return "errors/notRegistered.html";
|
return "error.html";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return "errors/falseInput.html";
|
return "errors/falseInput.html";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/newCode")
|
||||||
|
public String provideNewCode(@RequestParam String name, Model model){
|
||||||
|
AuthCode authCode = tableAction.generateToken(name, RandomNumber.getRandomNumberString(), authCodesRepository);
|
||||||
|
sendSimpleMessage(name, "Code zur Authentifizierung", "Dein Code lautet: " + authCode.getCode());
|
||||||
|
model.addAttribute("name", name);
|
||||||
|
model.addAttribute("codeTime", authCodesRepository.findByName(name).getExpirationTime());
|
||||||
|
model.addAttribute("codeExpired", false);
|
||||||
|
model.addAttribute("codeFalse", false);
|
||||||
|
return "authenticate.html";
|
||||||
|
}
|
||||||
|
|
||||||
@RequestMapping("/vote")
|
@RequestMapping("/vote")
|
||||||
public String voting_adding(@RequestParam String code, @RequestParam String name, Model model) {
|
public String voting_adding(@RequestParam String code, @RequestParam String name, Model model) {
|
||||||
String tokenStatus = tableAction.checkToken(name, code, authCodesRepository);
|
String tokenStatus = tableAction.checkToken(name, code, authCodesRepository);
|
||||||
|
|
||||||
if (tokenStatus.equals("matched")) {
|
if (tokenStatus.equals("matched")) {
|
||||||
LOGGER.warn("matched");
|
LOGGER.warn("matched");
|
||||||
if (mottoPhase) {
|
if (addingPhase) {
|
||||||
List<Motto> mottos = mottoRepository.findAll();
|
|
||||||
model.addAttribute("mottos", mottos);
|
|
||||||
model.addAttribute("name", name);
|
|
||||||
return "mottoVoting.html";
|
|
||||||
} else if (addingPhase) {
|
|
||||||
PossibleCandidateWrapper possibleCandidates = new PossibleCandidateWrapper();
|
PossibleCandidateWrapper possibleCandidates = new PossibleCandidateWrapper();
|
||||||
List<Category> categories = categoryRepository.findAll();
|
List<Category> categories = categoryRepository.findAll();
|
||||||
for (int i = 0; i < categories.size(); i++) {
|
for (int i = 0; i < categories.size(); i++) {
|
||||||
@@ -197,7 +186,7 @@ public class VotingController {
|
|||||||
|
|
||||||
@RequestMapping("/saveCandidates")
|
@RequestMapping("/saveCandidates")
|
||||||
public String candidateSaving(@ModelAttribute PossibleCandidateWrapper possibleCandidates, @RequestParam String name) {
|
public String candidateSaving(@ModelAttribute PossibleCandidateWrapper possibleCandidates, @RequestParam String name) {
|
||||||
if (voterRepository.findByEmail(name).getVote_status()) {
|
if (voterRepository.findByEmail(name).getCandidatesubmit_status()) {
|
||||||
return "errors/alreadyVoted.html";
|
return "errors/alreadyVoted.html";
|
||||||
} else {
|
} else {
|
||||||
LinkedList<PossibleCandidate> posCandidates = possibleCandidates.getPossibleCandidates();
|
LinkedList<PossibleCandidate> posCandidates = possibleCandidates.getPossibleCandidates();
|
||||||
@@ -208,42 +197,55 @@ public class VotingController {
|
|||||||
PossibleCandidate p = possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get());
|
PossibleCandidate p = possibleCandidateRepository.findByNameAndCategory(posCandidate.getName(), categoryRepository.findById(index).get());
|
||||||
p.setVotes(p.getVotes() + 1);
|
p.setVotes(p.getVotes() + 1);
|
||||||
possibleCandidateRepository.save(p);
|
possibleCandidateRepository.save(p);
|
||||||
|
} else if (possibleCandidateRepository.findByNameAndCategory(posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1], categoryRepository.findById(index).get()) != null){
|
||||||
|
PossibleCandidate p = possibleCandidateRepository.findByNameAndCategory(posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1], categoryRepository.findById(index).get());
|
||||||
|
p.setVotes(p.getVotes() + 1);
|
||||||
|
possibleCandidateRepository.save(p);
|
||||||
} else {
|
} else {
|
||||||
PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get());
|
if (index > 31 && posCandidate.getName().indexOf(" ") != -1) {
|
||||||
possibleCandidateRepository.save(possibleCandidate);
|
if (posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1].equals("Neumann") ||
|
||||||
|
posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1].equals("neumann") ||
|
||||||
|
posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1].equals("Mecklenburg") ||
|
||||||
|
posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length-1].equals("mecklenburg")){
|
||||||
|
PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get());
|
||||||
|
possibleCandidateRepository.save(possibleCandidate);
|
||||||
|
} else {
|
||||||
|
posCandidate.setName(posCandidate.getName().split(" ")[posCandidate.getName().split(" ").length - 1]);
|
||||||
|
PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get());
|
||||||
|
possibleCandidateRepository.save(possibleCandidate);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PossibleCandidate possibleCandidate = new PossibleCandidate(posCandidate.getName(), categoryRepository.findById(index).get());
|
||||||
|
possibleCandidateRepository.save(possibleCandidate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
tableAction.updateCandidatesubmit_status(name, voterRepository);
|
|
||||||
return "candidateAddingSuccessful.html";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/saveMotto")
|
tableAction.updateCandidatesubmit_status(name, voterRepository);
|
||||||
public String mottoSaving(@RequestParam String name, @RequestParam String voteValue) {
|
return "voteSuccessful.html";
|
||||||
LOGGER.info(name);
|
|
||||||
if (voterRepository.findByEmail(name).getMotto_status()) {
|
|
||||||
return "errors/alreadySubmitted.html";
|
|
||||||
} else {
|
|
||||||
tableAction.voteForMotto(voteValue, mottoRepository);
|
|
||||||
tableAction.updateMottoStatus(name, voterRepository);
|
|
||||||
LOGGER.info(name + " has choose his motto");
|
|
||||||
}
|
}
|
||||||
return "voteSuccessful.html";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/processVote")
|
@RequestMapping("/processVote")
|
||||||
public String ProcessVote(@RequestParam String name, @RequestParam String voteValues) {
|
public String ProcessVote(@RequestParam String name, @RequestParam String voteValues) {
|
||||||
if (voterRepository.findByEmail(name).getCandidatesubmit_status()) {
|
if (voterRepository.findByEmail(name).getVote_status()) {
|
||||||
return "errors/alreadySubmitted.html";
|
return "errors/alreadyVoted.html";
|
||||||
} else {
|
} else {
|
||||||
String[] partVoteValues = voteValues.split(",");
|
LinkedList<String> voteFor = new LinkedList<>();
|
||||||
for (String s : partVoteValues) {
|
if(!voteValues.equals("")) {
|
||||||
|
String[] partVoteValues = voteValues.split(",");
|
||||||
|
for (String s : partVoteValues) {
|
||||||
|
voteFor.add(s);
|
||||||
|
}
|
||||||
|
LOGGER.info(name + " has voted!");
|
||||||
|
}
|
||||||
|
for (String s: voteFor) {
|
||||||
tableAction.voteForCandidate(s, candidateRepository);
|
tableAction.voteForCandidate(s, candidateRepository);
|
||||||
}
|
}
|
||||||
|
|
||||||
tableAction.updateVotingStatus(name, voterRepository);
|
tableAction.updateVotingStatus(name, voterRepository);
|
||||||
LOGGER.info(name + " has voted!");
|
|
||||||
return "voteSuccessful.html";
|
return "voteSuccessful.html";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,12 @@ public class AuthCode {
|
|||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getExpirationTime(){
|
||||||
|
return time + 1800*1000;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isExpired(){
|
public boolean isExpired(){
|
||||||
return System.currentTimeMillis() >= (time + 600*1000);
|
return System.currentTimeMillis() >= (time + 1800*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTime(long time) {
|
public void setTime(long time) {
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
package com.github.cato447.AbizeitungVotingSystem.entities;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
@Table(name = "mottos")
|
|
||||||
public class Motto implements Comparable<Motto>{
|
|
||||||
|
|
||||||
public Motto() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Motto(String name) {
|
|
||||||
super();
|
|
||||||
this.name = name;
|
|
||||||
this.votes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
private Long id;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
private Integer votes;
|
|
||||||
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getVotes() {
|
|
||||||
return votes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setVotes(Integer votes) {
|
|
||||||
this.votes = votes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void voteFor() {
|
|
||||||
this.votes += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compareTo(Motto m) {
|
|
||||||
if (getVotes() == null || m.getVotes() == null) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return m.getVotes().compareTo(getVotes());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,6 @@ public class Voter {
|
|||||||
this.email = email;
|
this.email = email;
|
||||||
this.vote_status = false;
|
this.vote_status = false;
|
||||||
this.candidatesubmit_status = false;
|
this.candidatesubmit_status = false;
|
||||||
this.motto_status = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@@ -22,7 +21,6 @@ public class Voter {
|
|||||||
private Long id;
|
private Long id;
|
||||||
private String email;
|
private String email;
|
||||||
private Boolean vote_status;
|
private Boolean vote_status;
|
||||||
private Boolean motto_status;
|
|
||||||
private Boolean candidatesubmit_status;
|
private Boolean candidatesubmit_status;
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
@@ -41,10 +39,6 @@ public class Voter {
|
|||||||
return candidatesubmit_status;
|
return candidatesubmit_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getMotto_status() {
|
|
||||||
return motto_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void vote(){
|
public void vote(){
|
||||||
vote_status = true;
|
vote_status = true;
|
||||||
}
|
}
|
||||||
@@ -52,6 +46,4 @@ public class Voter {
|
|||||||
public void submitCandidates() {
|
public void submitCandidates() {
|
||||||
candidatesubmit_status = true;
|
candidatesubmit_status = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voteMotto() { motto_status = true;}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
package com.github.cato447.AbizeitungVotingSystem.repositories;
|
|
||||||
|
|
||||||
import com.github.cato447.AbizeitungVotingSystem.entities.Motto;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public interface MottoRepository extends JpaRepository<Motto, Integer> {
|
|
||||||
|
|
||||||
public Motto findByName(String name);
|
|
||||||
|
|
||||||
Optional<Motto> findById(Long id);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,9 @@
|
|||||||
package com.github.cato447.AbizeitungVotingSystem.table;
|
package com.github.cato447.AbizeitungVotingSystem.table;
|
||||||
|
|
||||||
import com.github.cato447.AbizeitungVotingSystem.controller.VotingController;
|
|
||||||
import com.github.cato447.AbizeitungVotingSystem.entities.*;
|
import com.github.cato447.AbizeitungVotingSystem.entities.*;
|
||||||
import com.github.cato447.AbizeitungVotingSystem.repositories.*;
|
import com.github.cato447.AbizeitungVotingSystem.repositories.*;
|
||||||
import org.aspectj.weaver.loadtime.definition.LightXMLParser;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Array;
|
|
||||||
import java.net.JarURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.nio.Buffer;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class TableAction {
|
public class TableAction {
|
||||||
@@ -31,12 +24,6 @@ public class TableAction {
|
|||||||
voterRepository.save(voter);
|
voterRepository.save(voter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateMottoStatus(String email, VoterRepository voterRepository){
|
|
||||||
Voter voter = voterRepository.findByEmail(email);
|
|
||||||
voter.voteMotto();
|
|
||||||
voterRepository.save(voter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public AuthCode generateToken(String name, String code, AuthCodesRepository authCodesRepository) {
|
public AuthCode generateToken(String name, String code, AuthCodesRepository authCodesRepository) {
|
||||||
AuthCode authCode = new AuthCode(name, code);
|
AuthCode authCode = new AuthCode(name, code);
|
||||||
try{
|
try{
|
||||||
@@ -67,12 +54,12 @@ public class TableAction {
|
|||||||
return "wrong";
|
return "wrong";
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean fiveMinutesPassed(Long time){
|
public void deleteToken(String name, AuthCodesRepository authCodesRepository){
|
||||||
return System.currentTimeMillis() >= (time + 300*1000);
|
authCodesRepository.delete(authCodesRepository.findByName(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getLimit(List<PossibleCandidate> possibleCandidates){
|
private int getLimit(List<PossibleCandidate> possibleCandidates){
|
||||||
return possibleCandidates.size() <= 5 ? possibleCandidates.size() : 5;
|
return possibleCandidates.size() <= 15 ? possibleCandidates.size() : 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voteForCandidate(String id, CandidateRepository candidateRepository){
|
public void voteForCandidate(String id, CandidateRepository candidateRepository){
|
||||||
@@ -82,15 +69,8 @@ public class TableAction {
|
|||||||
candidateRepository.save(candidate);
|
candidateRepository.save(candidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void voteForMotto(String id, MottoRepository mottoRepository){
|
|
||||||
long mottoID = Long.valueOf(id);
|
|
||||||
Motto motto = mottoRepository.findById(mottoID).get();
|
|
||||||
motto.voteFor();
|
|
||||||
mottoRepository.save(motto);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUpVoters(VoterRepository voterRepository){
|
public void setUpVoters(VoterRepository voterRepository){
|
||||||
try (InputStream inputStream = getClass().getResourceAsStream("/Q2_emails.txt");
|
try (InputStream inputStream = getClass().getResourceAsStream("/Email_Whitelist.txt");
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
|
||||||
String line = "";
|
String line = "";
|
||||||
ArrayList<Voter> voters = new ArrayList<Voter>();
|
ArrayList<Voter> voters = new ArrayList<Voter>();
|
||||||
@@ -119,8 +99,17 @@ public class TableAction {
|
|||||||
Collections.sort(possibleCandidatesPerCategory, Comparator.comparing(PossibleCandidate::getVotes));
|
Collections.sort(possibleCandidatesPerCategory, Comparator.comparing(PossibleCandidate::getVotes));
|
||||||
Collections.reverse(possibleCandidatesPerCategory);
|
Collections.reverse(possibleCandidatesPerCategory);
|
||||||
for (int j = 0; j < getLimit(possibleCandidatesPerCategory); j++){
|
for (int j = 0; j < getLimit(possibleCandidatesPerCategory); j++){
|
||||||
Candidate candidate = new Candidate(possibleCandidatesPerCategory.get(j).getName(), possibleCandidatesPerCategory.get(j).getCategory());
|
if (j >= 10 && possibleCandidatesPerCategory.get(j).getVotes() == possibleCandidatesPerCategory.get(9).getVotes()){
|
||||||
candidateRepository.save(candidate);
|
Candidate candidate = new Candidate(possibleCandidatesPerCategory.get(j).getName(), possibleCandidatesPerCategory.get(j).getCategory());
|
||||||
|
candidateRepository.save(candidate);
|
||||||
|
}
|
||||||
|
if (j < 10){
|
||||||
|
Candidate candidate = new Candidate(possibleCandidatesPerCategory.get(j).getName(), possibleCandidatesPerCategory.get(j).getCategory());
|
||||||
|
candidateRepository.save(candidate);
|
||||||
|
}
|
||||||
|
if (j == 14){
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i += -1;
|
i += -1;
|
||||||
possibleCandidatesPerCategory.clear();
|
possibleCandidatesPerCategory.clear();
|
||||||
@@ -147,20 +136,4 @@ public class TableAction {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUpMottos(MottoRepository mottoRepository){
|
|
||||||
try (InputStream inputStream = getClass().getResourceAsStream("/Mottos.txt");
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
|
|
||||||
String line = "";
|
|
||||||
ArrayList<Motto> mottos = new ArrayList<>();
|
|
||||||
while ((line = reader.readLine())!= null){
|
|
||||||
String name = line;
|
|
||||||
Motto motto = new Motto(name);
|
|
||||||
mottos.add(motto);
|
|
||||||
}
|
|
||||||
mottoRepository.saveAll(mottos);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
Wer wird nie von zuhause ausziehen?
|
|
||||||
Wer ist der/die kreativste Zuspätkommer/in?
|
|
||||||
Mit wem wird man am ehesten in der Zukunft angeben zur Schule gegangen zu sein?
|
|
||||||
Wer wohnt im Fittnessstudio? (Schüler)
|
|
||||||
Wer ist der coolste Leherer?
|
|
||||||
Wer ist die coolste Lehrerin?
|
|
||||||
Wer macht den besten Matheunterricht?
|
|
||||||
Welcher Lehrer hat den Beruf verfehlt?
|
|
||||||
Welcher Lehrer ist nie da?
|
|
||||||
Wer hat das Internet erfunden?
|
|
||||||
Wer sponsort Schollin? (Schüler)
|
|
||||||
Wer ist am engagiertesten? (Schüler)
|
|
||||||
Wer wird Bundeskanzler? (Schüler)
|
|
||||||
Wer hat das Kimpeltum gegründet? (Schüler)
|
|
||||||
Wer saß am längsten im Klassenschrank? (Schüler)
|
|
||||||
Wer hat die gößte Sauklaue? (Leherer)
|
|
||||||
Wer gründet das nächste Google? (Schüler)
|
|
||||||
Wer kommt am schnellsten in den Knast? (Schüler)
|
|
||||||
Top 3-Pärchen? (Schüler)
|
|
||||||
Top 3 Lehrergespanne? (Schüler)
|
|
||||||
Wer ist der motiviertester Lehrer?
|
|
||||||
Wer ist Google auf zwei Beinen(Schüler)?
|
|
||||||
Wer hat den besten Style (Schüler)?
|
|
||||||
Wer hat den besten Style (Lehrer)?
|
|
||||||
Wer währe ein gutes Pärchen (Lehrer)?
|
|
||||||
Wer trinkt am meisten Kaffe (Schüler)?
|
|
||||||
Wer trinkt am meisten Kaffe (Lehrer)?
|
|
||||||
Tischflip?
|
|
||||||
Wer wird Harzer?
|
|
||||||
Wer hat Wiedererkennungswert (Schüler)?
|
|
||||||
Wen erkennt man an der Lache (Schüler)?
|
|
||||||
Wer bringt die dümmsten Witze? (Lehrer)
|
|
||||||
Wer hat den meisten Schwachsinn erzählt? (Lehrer)
|
|
||||||
Welche Lehrer machen nie das, was die Schüler wollten? (Lehrer)
|
|
||||||
Wer isst immer? (Lehrer)
|
|
||||||
Wer hat die meisten peinlichen Momente gebracht?
|
|
||||||
0
src/main/resources/Email_Whitelist.txt
Normal file
0
src/main/resources/Email_Whitelist.txt
Normal file
@@ -1,11 +0,0 @@
|
|||||||
CannABIs - wir haben es durchgezogen!
|
|
||||||
ABI 2,010 ‰ - Meist dichter als Denker
|
|
||||||
KABItän Blaubär - Immer blau und trotzdem schlau
|
|
||||||
HABI Potter - Wir verlassen die Kammer des Schreckens
|
|
||||||
A BItch - Für einen Punkt tue ich alles!
|
|
||||||
ABIthur - Wenn das Elite von die Gymnahsium gehen tut
|
|
||||||
LABIrinth - Planlos zum Ziel
|
|
||||||
ABIcrombie & Fitch - Models gehen, Elche bleiben (Abercrombie & Fitch)
|
|
||||||
SemipermeABIlität - Nur die Besten kommen durch
|
|
||||||
KohlrABI - Wir machen uns vom Acker
|
|
||||||
ABIgasmus - Aber das war nur das Vorspiel
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
negar.barzegar@adolfinum.de
|
|
||||||
simon.berger@adolfinum.de
|
|
||||||
nicolas.cunha@adolfinum.de
|
|
||||||
joline.hackstein@adolfinum.de
|
|
||||||
philip.heckhoff@adolfinum.de
|
|
||||||
simon.hormes@adolfinum.de
|
|
||||||
benjamin.vogt@adolfinum.de
|
|
||||||
taycan.arslan@adolfinum.de
|
|
||||||
luca.boom@adolfinum.de
|
|
||||||
leon.borgerding@adolfinum.de
|
|
||||||
lukas.boy@adolfinum.de
|
|
||||||
lukas.corell@adolfinum.de
|
|
||||||
cedric.damerow@adolfinum.de
|
|
||||||
amelie.david@adolfinum.de
|
|
||||||
zeynep.efe@adolfinum.de
|
|
||||||
melinda.hirschelmann@adolfinum.de
|
|
||||||
lars.hogardt@adolfinum.de
|
|
||||||
malin.kalnins@adolfinum.de
|
|
||||||
victor.kocksnchez@adolfinum.de
|
|
||||||
kamil.kowalczyk@adolfinum.de
|
|
||||||
romyna.gurny@adolfinum.de
|
|
||||||
noelia.kocksnchez@adolfinum.de
|
|
||||||
lili.schweitzer@adolfinum.de
|
|
||||||
jerome.laukamp@adolfinum.de
|
|
||||||
elisa.bahl@adolfinum.de
|
|
||||||
lisa.baumeister@adolfinum.de
|
|
||||||
johanna.boeckmann@adolfinum.de
|
|
||||||
svenja.fischer@adolfinum.de
|
|
||||||
lena.goehlich@adolfinum.de
|
|
||||||
paula.haub@adolfinum.de
|
|
||||||
daria.horstmann@adolfinum.de
|
|
||||||
melina.kascha@adolfinum.de
|
|
||||||
pia.kleinwegen@adolfinum.de
|
|
||||||
lauramarie.koenig@adolfinum.de
|
|
||||||
yarkin.kulaksiz@adolfinum.de
|
|
||||||
amelie.laake@adolfinum.de
|
|
||||||
noemi.malaponti@adolfinum.de
|
|
||||||
yara.mueser@adolfinum.de
|
|
||||||
paul.nowack@adolfinum.de
|
|
||||||
luca.ofiera@adolfinum.de
|
|
||||||
timo.otto@adolfinum.de
|
|
||||||
linnea.paulukuhn@adolfinum.de
|
|
||||||
isabelle.schneider@adolfinum.de
|
|
||||||
nico.scholzen@adolfinum.de
|
|
||||||
manon.schroff@adolfinum.de
|
|
||||||
carlotta.tueckmantel@adolfinum.de
|
|
||||||
simon.bussmann@adolfinum.de
|
|
||||||
luis.erpenbach@adolfinum.de
|
|
||||||
meret.fass@adolfinum.de
|
|
||||||
anna.feldmann@adolfinum.de
|
|
||||||
alina.fuenderich@adolfinum.de
|
|
||||||
joline.gilles@adolfinum.de
|
|
||||||
karolina.hein@adolfinum.de
|
|
||||||
robin.heldt@adolfinum.de
|
|
||||||
annika.koch@adolfinum.de
|
|
||||||
dusanka.djukanovic@adolfinum.de
|
|
||||||
aaron.glos@adolfinum.de
|
|
||||||
ayseguel.guelten@adolfinum.de
|
|
||||||
hamza.hasoumi@adolfinum.de
|
|
||||||
evelyn.hofmann@adolfinum.de
|
|
||||||
burakmustafa.kulac@adolfinum.de
|
|
||||||
dominik.kwitowski@adolfinum.de
|
|
||||||
julia.lener@adolfinum.de
|
|
||||||
paula.may@adolfinum.de
|
|
||||||
luca.mueller@adolfinum.de
|
|
||||||
mathieu.mueller@adolfinum.de
|
|
||||||
marie.puetter@adolfinum.de
|
|
||||||
hendrik.herffs@adolfinum.de
|
|
||||||
greta.bentgens@adolfinum.de
|
|
||||||
sven.mittmann@adolfinum.de
|
|
||||||
jan.hoevel@adolfinum.de
|
|
||||||
tim.krichel@adolfinum.de
|
|
||||||
milo.lehnen@adolfinum.de
|
|
||||||
lewis.lehner@adolfinum.de
|
|
||||||
nico.lipinski@adolfinum.de
|
|
||||||
luise.lu@adolfinum.de
|
|
||||||
maike.nawarotzky@adolfinum.de
|
|
||||||
rabea.peters@adolfinum.de
|
|
||||||
patrick.preuss@adolfinum.de
|
|
||||||
julius.preusser@adolfinum.de
|
|
||||||
marie.scheidung@adolfinum.de
|
|
||||||
lena.schlayer@adolfinum.de
|
|
||||||
emma.sprenger@adolfinum.de
|
|
||||||
klaudia.kapala@adolfinum.de
|
|
||||||
gabriel.schacht@adolfinum.de
|
|
||||||
delia.schmitz@adolfinum.de
|
|
||||||
katharina.schmitz@adolfinum.de
|
|
||||||
laurin.severith@adolfinum.de
|
|
||||||
julian.sievers@adolfinum.de
|
|
||||||
anna.siewert@adolfinum.de
|
|
||||||
chiara.welter@adolfinum.de
|
|
||||||
kira.winzen@adolfinum.de
|
|
||||||
tim.zentzis@adolfinum.de
|
|
||||||
justus.boesken@adolfinum.de
|
|
||||||
finia.brinkmann@adolfinum.de
|
|
||||||
anesa.cavcic@adolfinum.de
|
|
||||||
antonia.eigemann@adolfinum.de
|
|
||||||
nico.hahn@adolfinum.de
|
|
||||||
timo.kohlmann@adolfinum.de
|
|
||||||
alexander.kupillas@adolfinum.de
|
|
||||||
alexander.neumann@adolfinum.de
|
|
||||||
sophie.osterloh@adolfinum.de
|
|
||||||
clemens.palinsky@adolfinum.de
|
|
||||||
oliver.palinsky@adolfinum.de
|
|
||||||
hendrik.pierlo@adolfinum.de
|
|
||||||
lilly.schmidtke@adolfinum.de
|
|
||||||
mara.spicker@adolfinum.de
|
|
||||||
anhtrung.vo@adolfinum.de
|
|
||||||
ben.schwarz@adolfinum.de
|
|
||||||
luca.urbanczyk@adolfinum.de
|
|
||||||
helena.neukirch@adolfinum.de
|
|
||||||
nikita.lauff@adolfinum.de
|
|
||||||
jennifer.lengard@adolfinum.de
|
|
||||||
julia.mueller@adolfinum.de
|
|
||||||
philipp.nothers@adolfinum.de
|
|
||||||
judith.oppenberg@adolfinum.de
|
|
||||||
dilan.oeztuerk@adolfinum.de
|
|
||||||
malo.soulier@adolfinum.de
|
|
||||||
mery.stern@adolfinum.de
|
|
||||||
nouel.verberkt@adolfinum.de
|
|
||||||
leon.viktora@adolfinum.de
|
|
||||||
pia.anthes@adolfinum.de
|
|
||||||
eray.arici@adolfinum.de
|
|
||||||
christian.beutel@adolfinum.de
|
|
||||||
mara.blanke@adolfinum.de
|
|
||||||
lilly.ventzke@adolfinum.de
|
|
||||||
luzi.weichert@adolfinum.de
|
|
||||||
moritz.weihnacht@adolfinum.de
|
|
||||||
leony.wittmann@adolfinum.de
|
|
||||||
annika.lieblang@adolfinum.de
|
|
||||||
leonie.wallusch@adolfinum.de
|
|
||||||
felix.kirsten@adolfinum.de
|
|
||||||
moritz.liebisch@adolfinum.de
|
|
||||||
christian.pickardt@adolfinum.de
|
|
||||||
jan.schliekmann@adolfinum.de
|
|
||||||
elsa.piplack@adolfinum.de
|
|
||||||
jolan.gerritzen@adolfinum.de
|
|
||||||
lorena.garau@adolfinum.de
|
|
||||||
matthias.karl@adolfinum.de
|
|
||||||
justin.kauschke@adolfinum.de
|
|
||||||
leonie.kramer@adolfinum.de
|
|
||||||
laura.kurreck@adolfinum.de
|
|
||||||
maya.lueck@adolfinum.de
|
|
||||||
sean.mccormick-silex@adolfinum.de
|
|
||||||
tim.mueller@adolfinum.de
|
|
||||||
lana.peric@adolfinum.de
|
|
||||||
jan.pintostrohhaeusl@adolfinum.de
|
|
||||||
laura.ruettershoff@adolfinum.de
|
|
||||||
charlotte.schirmer@adolfinum.de
|
|
||||||
lavinia.schmitz@adolfinum.de
|
|
||||||
victor.schroers@adolfinum.de
|
|
||||||
gerrit.schulz@adolfinum.de
|
|
||||||
clemens.spoo@adolfinum.de
|
|
||||||
simon.stavroulakis@adolfinum.de
|
|
||||||
ioannis.boerner@adolfinum.de
|
|
||||||
marwa.nafouti@adolfinum.de
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
spring.datasource.url=jdbc:mysql://localhost/VotingSystem
|
spring.datasource.url=jdbc:mysql://hostadress/database
|
||||||
spring.datasource.username=bitecoding
|
spring.datasource.username=mysql_username
|
||||||
spring.datasource.password=Cr@ckTh15
|
spring.datasource.password=mysql_password
|
||||||
|
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
|
||||||
@@ -8,11 +8,11 @@ spring.jpa.hibernate.ddl-auto=update
|
|||||||
server.port = 8000
|
server.port = 8000
|
||||||
|
|
||||||
######Email Properties ######
|
######Email Properties ######
|
||||||
spring.mail.host=smtp.gmail.com
|
spring.mail.host=
|
||||||
spring.mail.port=587
|
spring.mail.port=
|
||||||
spring.mail.properties.mail.smtp.starttls.enable=true
|
spring.mail.properties.mail.smtp.starttls.enable=true
|
||||||
spring.mail.username=adolfinumvoting@gmail.com
|
spring.mail.username=
|
||||||
spring.mail.password=Voting2021
|
spring.mail.password=
|
||||||
spring.mail.properties.mail.smtp.starttls.required=true
|
spring.mail.properties.mail.smtp.starttls.required=true
|
||||||
spring.mail.properties.mail.smtp.auth=true
|
spring.mail.properties.mail.smtp.auth=true
|
||||||
spring.mail.properties.mail.smtp.connectiontimeout=5000
|
spring.mail.properties.mail.smtp.connectiontimeout=5000
|
||||||
|
|||||||
@@ -20,15 +20,19 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
margin-top: 5%;
|
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
margin-bottom: 5%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2.categoryHeader {
|
h2 {
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h2.categoryCategory {
|
||||||
|
color: #bb1515;
|
||||||
|
margin-top: 5%;
|
||||||
|
margin-bottom: 1%;
|
||||||
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
background: #bb1515b2;
|
background: #bb1515b2;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -41,7 +45,6 @@ input {
|
|||||||
|
|
||||||
.submitButton {
|
.submitButton {
|
||||||
margin-top: 5%;
|
margin-top: 5%;
|
||||||
margin-bottom: 5%;
|
|
||||||
border: 0;
|
border: 0;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
background: #bb1515;
|
background: #bb1515;
|
||||||
|
|||||||
51
src/main/resources/static/styles/allreadyVoted.css
Normal file
51
src/main/resources/static/styles/allreadyVoted.css
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
body {
|
||||||
|
background-color: rgb(44, 49, 54);
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-screen {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
background: transparent;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #FFF;
|
||||||
|
font-size: 75px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #6d6d78;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submitButton {
|
||||||
|
padding: .25em 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
background: #bb1515;
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
font-size: 2rem;
|
||||||
|
width: 500px;
|
||||||
|
letter-spacing: .0625rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 3px 5px 1px rgba(0, 0, 0, 0.25);
|
||||||
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-image: linear-gradient(to bottom right, #111E25 0%, #111 100%);
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
}
|
||||||
@@ -21,9 +21,12 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
margin-top: 5%;
|
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
margin-bottom: 5%;
|
}
|
||||||
|
|
||||||
|
h1.end {
|
||||||
|
color: #6d6d78;
|
||||||
|
margin-bottom: 2%;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@@ -41,7 +44,7 @@ input {
|
|||||||
|
|
||||||
.submitButton {
|
.submitButton {
|
||||||
margin-top: 5%;
|
margin-top: 5%;
|
||||||
margin-bottom: 5%;
|
margin-bottom: 1%;
|
||||||
border: 0;
|
border: 0;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
background: #bb1515;
|
background: #bb1515;
|
||||||
@@ -54,6 +57,19 @@ input {
|
|||||||
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.newCode {
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
background: #bb1515;
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
font-size: 1rem;
|
||||||
|
width: 250px;
|
||||||
|
letter-spacing: .0625rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 3px 5px 1px rgba(0, 0, 0, 0.25);
|
||||||
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
.errorCode {
|
.errorCode {
|
||||||
margin-top: 10%;
|
margin-top: 10%;
|
||||||
color: #bb1515;
|
color: #bb1515;
|
||||||
|
|||||||
@@ -14,28 +14,6 @@ div.userLogin {
|
|||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
input.email_input {
|
|
||||||
background-color: transparent;
|
|
||||||
border: transparent;
|
|
||||||
border-bottom: 2px solid red;
|
|
||||||
color: #FFF;
|
|
||||||
font-size: xx-large;
|
|
||||||
width: fit-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
input.password_input {
|
|
||||||
background-color: transparent;
|
|
||||||
border: transparent;
|
|
||||||
color: #FFF;
|
|
||||||
font-size: medium;
|
|
||||||
width: fit-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
color: #FFF;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#signup_button {
|
#signup_button {
|
||||||
display: block;
|
display: block;
|
||||||
margin: auto;
|
margin: auto;
|
||||||
@@ -52,8 +30,24 @@ label {
|
|||||||
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-device-width: 1024px) {
|
input.email_input {
|
||||||
input.email_input {
|
background-color: transparent;
|
||||||
font-size: large;
|
border: transparent;
|
||||||
}
|
border-bottom: 2px solid #bb1515;
|
||||||
|
color: #FFF;
|
||||||
|
font-size: xx-large;
|
||||||
|
width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.password_input {
|
||||||
|
background-color: transparent;
|
||||||
|
border: transparent;
|
||||||
|
color: #FFF;
|
||||||
|
font-size: medium;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
color: #FFF;
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
54
src/main/resources/static/styles/voteSuccessful.css
Normal file
54
src/main/resources/static/styles/voteSuccessful.css
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
body {
|
||||||
|
background-color: rgb(44, 49, 54);
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-screen {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
background: transparent;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
width: 100%;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2.time_remain {
|
||||||
|
color: #6d6d78;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submitButton {
|
||||||
|
padding: .25em 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
background: #bb1515;
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
font-size: 2rem;
|
||||||
|
width: 500px;
|
||||||
|
letter-spacing: .0625rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 3px 5px 1px rgba(0, 0, 0, 0.25);
|
||||||
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-image: linear-gradient(to bottom right, #111E25 0%, #111 100%);
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
}
|
||||||
@@ -42,7 +42,8 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.submitButton {
|
.submitButton {
|
||||||
margin-top: 5%;
|
margin-top: 2%;
|
||||||
|
margin-bottom: 5%;
|
||||||
padding: .25em 0;
|
padding: .25em 0;
|
||||||
border: 0;
|
border: 0;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
@@ -56,6 +57,23 @@ button {
|
|||||||
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-device-width: 480px) {
|
||||||
|
.submitButton {
|
||||||
|
margin-top: 2%;
|
||||||
|
padding: .25em 0;
|
||||||
|
border: 0;
|
||||||
|
outline: 0;
|
||||||
|
background: rgb(6, 216, 136);
|
||||||
|
color: rgba(255, 255, 255, 0.85);
|
||||||
|
font-size: 2rem;
|
||||||
|
width: 500px;
|
||||||
|
letter-spacing: .0625rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 3px 5px 1px rgba(0, 0, 0, 0.25);
|
||||||
|
text-shadow: 0 -2px 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body {
|
body {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
$('#inputForm div.group:nth-child(' + q + ')').hide();
|
$('#inputForm div.group:nth-child(' + q + ')').hide();
|
||||||
$('#inputForm div.group:nth-child(' + (q + 1) + ')').show();
|
$('#inputForm div.group:nth-child(' + (q + 1) + ')').show();
|
||||||
if (q == (qMax - 1)) {
|
if (q == (qMax - 1)) {
|
||||||
$('#btnNext').html('Submit Answers');
|
$('#btnNext').html('Eingabe bestätigen');
|
||||||
}
|
}
|
||||||
q++;
|
q++;
|
||||||
} else {
|
} else {
|
||||||
@@ -42,11 +42,17 @@
|
|||||||
<form id="inputForm" action="#" th:action="@{/saveCandidates}" th:object="${form}" method="post">
|
<form id="inputForm" action="#" th:action="@{/saveCandidates}" th:object="${form}" method="post">
|
||||||
<div id="candidateAdding">
|
<div id="candidateAdding">
|
||||||
<div class="group" th:each="category, itemStat : ${categories}">
|
<div class="group" th:each="category, itemStat : ${categories}">
|
||||||
|
<div th:if="${itemStat.index > 30}">
|
||||||
|
<h2 class="categoryCategory">Lehrer</h2>
|
||||||
|
</div>
|
||||||
|
<div th:unless="${itemStat.index > 30}">
|
||||||
|
<h2 class="categoryCategory">Schüler</h2>
|
||||||
|
</div>
|
||||||
<h2 class="categoryHeader" th:text="${category.name}"></h2>
|
<h2 class="categoryHeader" th:text="${category.name}"></h2>
|
||||||
<input th:field="*{possibleCandidates[__${itemStat.index}__].name}"/>
|
<input th:field="*{possibleCandidates[__${itemStat.index}__].name}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="submitButton" id="btnNext" type="submit">Nächste Frage</button>
|
<button class="submitButton" id="btnNext" type="submit">Nächste Kategorie</button>
|
||||||
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,14 +10,9 @@
|
|||||||
|
|
||||||
<body class="center-screen">
|
<body class="center-screen">
|
||||||
|
|
||||||
<script>
|
|
||||||
var scale = Math.min(
|
|
||||||
availableWidth / contentWidth,
|
|
||||||
availableHeight / contentHeight
|
|
||||||
);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<h1 th:text="|Dir wurde ein Code an ${name} gesendet!|"></h1>
|
<h1 th:text="|Dir wurde ein Code an ${name} gesendet!|"></h1>
|
||||||
|
<h1>Nicht wundern das kann ein wenig dauern!</h1>
|
||||||
|
<h1 id="time_remain" class="end" th:text="${codeTime}"></h1>
|
||||||
<h2>Bitte gebe den Authentifizierungscode ein</h2>
|
<h2>Bitte gebe den Authentifizierungscode ein</h2>
|
||||||
<form action="#" id="passForm" th:action="@{/vote}" method="post">
|
<form action="#" id="passForm" th:action="@{/vote}" method="post">
|
||||||
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
||||||
@@ -28,11 +23,18 @@
|
|||||||
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
||||||
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
||||||
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
<input type="text" placeholder="•" class="passInput" name="pass[]" maxlength="1" autocomplete="off" required pattern="\d{1}">
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
<button class="submitButton" id="signup_button" onclick="getCode()">Abstimmen</button>
|
<button class="submitButton" id="signup_button" onclick="getCode()">Abstimmen</button>
|
||||||
|
|
||||||
|
|
||||||
|
<form action="#" th:action="@{/newCode}" method="post">
|
||||||
|
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
||||||
|
<button class="newCode">Neuen Code anfordern</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
<div th:if="${codeExpired}">
|
<div th:if="${codeExpired}">
|
||||||
<h2 class="errorCode">Der Code ist nicht mehr gültig!<br>Fordere einen neuen an</h2>
|
<h2 class="errorCode">Der Code ist nicht mehr gültig!</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div th:if="${codeFalse}">
|
<div th:if="${codeFalse}">
|
||||||
@@ -76,6 +78,33 @@
|
|||||||
output.value = code;
|
output.value = code;
|
||||||
document.getElementById("passForm").submit();
|
document.getElementById("passForm").submit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateCounter(time) {
|
||||||
|
const zeroPad = (num, places) => String(num).padStart(places, '0')
|
||||||
|
|
||||||
|
// Show time remaining now.
|
||||||
|
showTimeRemaining();
|
||||||
|
|
||||||
|
var dateFuture = time;
|
||||||
|
console.log(dateFuture);
|
||||||
|
|
||||||
|
// Set a timer to update the displayed clock every 1000 milliseconds.
|
||||||
|
var updateTimeLoop = setInterval(showTimeRemaining, 1000);
|
||||||
|
|
||||||
|
function showTimeRemaining() {
|
||||||
|
var dateNow = Date.now();
|
||||||
|
var days = zeroPad(Math.floor((dateFuture - dateNow) / (1000 * 60 * 60 * 24)), 2);
|
||||||
|
var hours = zeroPad(Math.floor(((dateFuture - dateNow) - days * 1000 * 60 * 60 * 24) / (1000 * 60 * 60)), 2);
|
||||||
|
var mins = zeroPad(Math.floor(((dateFuture - dateNow) - days * 1000 * 60 * 60 * 24 - hours * 1000 * 60 * 60) / (1000 * 60)), 2);
|
||||||
|
var secs = zeroPad(Math.floor(((dateFuture - dateNow) - days * 1000 * 60 * 60 * 24 - hours * 1000 * 60 * 60 - mins * 1000 * 60) / 1000), 2);
|
||||||
|
document.getElementById("time_remain").innerHTML = "Der Code gilt noch für " + mins + ":" + secs;
|
||||||
|
if (hours + mins + secs == 0) {
|
||||||
|
document.getElementById("time_remain").innerHTML = "Der Code ist abgelaufen";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateCounter(document.getElementById("time_remain").innerHTML);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,10 +1,24 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html lang="de" xmlns:th="https://www.thymeleaf.org/">
|
||||||
|
|
||||||
<body>
|
<head>
|
||||||
<h1>Something went wrong! </h1>
|
<meta charset="UTF-8">
|
||||||
<h2>Our Engineers are on it</h2>
|
<title>Title</title>
|
||||||
<a href="/">Go Home</a>
|
<link th:href="@{/styles/allreadyVoted.css}" rel="stylesheet" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="center-screen">
|
||||||
|
<div class="centered">
|
||||||
|
<h1>Oops irgendwas ist kaputt gegangen</h1>
|
||||||
|
<h2 id="time_remain">Keine Sorge! <br> Probiers nochmal :D</h2>
|
||||||
|
<button id="backButton" class="submitButton">Zurück zum Anfang</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("backButton").onclick = function() {
|
||||||
|
location.href = "/";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -3,12 +3,21 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Abizeitung 2020/2021 Voting</title>
|
<title>Title</title>
|
||||||
|
<link th:href="@{/styles/allreadyVoted.css}" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body class="center-screen">
|
||||||
<h1 style="color: red;"> Jeder darf nur einmal abstimmen! </h1>
|
<div class="centered">
|
||||||
<a href="/">Return to Login-Site</a>
|
<h1>Du hast schon abgestimmt!</h1>
|
||||||
|
<button id="backButton" class="submitButton">Zurück zum Anfang</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("backButton").onclick = function() {
|
||||||
|
location.href = "/";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="de" xmlns:th="https://www.thymeleaf.org/">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Title</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 style="color: red;">Du hast deine Motto schon gewählt!</h1>
|
|
||||||
<a href="/">Return to Login-Site</a>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="de" xmlns:th="https://www.thymeleaf.org/">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Title</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1 style="color: red;">Du hast deine Kandidaten schon vorgeschlagen!</h1>
|
|
||||||
<a href="/">Return to Login-Site</a>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,14 +1,24 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="de" xmlns:th="https://www.thymeleaf.org/">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Abizeitung 2020/2021 Voting</title>
|
<title>Title</title>
|
||||||
|
<link th:href="@{/styles/allreadyVoted.css}" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body class="center-screen">
|
||||||
<h1> Überprüfe noch einmal die eingegebene E-Mail Adresse Sollte der Fall eintreten, dass du deine E-Mail Adresse richtig eingegeben hast und du Schüler der Q2 bist, schreibe eine Mail an simon.bussmann@adolfinum.de mit dem Betreff LoginFehler</h1>
|
<div class="centered">
|
||||||
<a href="/">Return to Login-Site</a>
|
<h1>Du bist nicht zur Wahl zugelassen!</h1>
|
||||||
|
<h2 id="time_remain">Falls du abstimmen können solltest <br> schreibe eine Mail an adolfinumvoting@gmail.com</h2>
|
||||||
|
<button id="backButton" class="submitButton">Zurück zum Anfang</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("backButton").onclick = function() {
|
||||||
|
location.href = "/";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
24
src/main/resources/templates/errors/votingClosed.html
Normal file
24
src/main/resources/templates/errors/votingClosed.html
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de" xmlns:th="https://www.thymeleaf.org/">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Title</title>
|
||||||
|
<link th:href="@{/styles/allreadyVoted.css}" rel="stylesheet" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="center-screen">
|
||||||
|
<div class="centered">
|
||||||
|
<h1>Du bist leider zu spät</h1>
|
||||||
|
<h2>Momentan ist hier auf der Seite nichts los</h2>
|
||||||
|
<button id="backButton" class="submitButton">Zur Adolfinum Seite</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("backButton").onclick = function() {
|
||||||
|
location.href = "https://adolfinum.de";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="de-DE" xmlns:th="http://thymeleaf.org">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Abizeitung 2020/2021 Voting</title>
|
|
||||||
<link th:href="@{/styles/first.css}" rel="stylesheet" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h2>Paragraphes</h2>
|
|
||||||
<p>This is a paragraph.</p>
|
|
||||||
<p>This is another paragraph.</p>
|
|
||||||
|
|
||||||
<h2>Links</h2>
|
|
||||||
<a href="https://www.w3schools.com">This is a link</a>
|
|
||||||
|
|
||||||
<h2>HTML Images</h2>
|
|
||||||
<p>HTML images are defined with the img tag:</p>
|
|
||||||
<img src="https://www.lifewire.com/thmb/-27LpEPPTgNRUORa_mIczKDkWh0=/1280x905/filters:fill(auto,1)/what-is-binary-and-how-does-it-work-4692749-1-1eaec2e636424e71bb35419ef8d5005b.png" alt="Binary example picture" width="400" height="400">
|
|
||||||
|
|
||||||
<h2>Line breaks</h2>
|
|
||||||
<p>This is a <br> paragraph with a line break.</p>
|
|
||||||
|
|
||||||
<h2>Styling</h2>
|
|
||||||
<p style="color:red;">This is a red paragraph.</p>
|
|
||||||
|
|
||||||
<h2>Title attribute</h2>
|
|
||||||
<p title="I'm a tooltip">This is a paragraph.</p>
|
|
||||||
|
|
||||||
<h2>Quotes in attributes</h2>
|
|
||||||
<p title='John "ShotGun" Nelson'>Example 1</p>
|
|
||||||
<p title="John 'ShotGun' Nelson">Example 2</p>
|
|
||||||
|
|
||||||
<h2>Bigger headings</h2>
|
|
||||||
<h1>Heading 1</h1>
|
|
||||||
|
|
||||||
<h2>HTML Display</h2>
|
|
||||||
<p>
|
|
||||||
This paragraph contains a lot of lines in the source code, but the browser ignores it.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
This paragraph contains a lot of spaces in the source code, but the browser ignores it.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Poem Problem</h2>
|
|
||||||
<p>
|
|
||||||
My Bonnie lies over the ocean. My Bonnie lies over the sea. My Bonnie lies over the ocean. Oh, bring back my Bonnie to me.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h5>Solution:</h5>
|
|
||||||
<pre>
|
|
||||||
My Bonnie lies over the ocean.
|
|
||||||
|
|
||||||
My Bonnie lies over the sea.
|
|
||||||
|
|
||||||
My Bonnie lies over the ocean.
|
|
||||||
|
|
||||||
Oh, bring back my Bonnie to me.
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
@@ -1,10 +1,24 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="de" xmlns:th="http://thymeleaf.org">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Title</title>
|
<title>Title</title>
|
||||||
|
<link th:href="@{/styles/voteSuccessful.css}" rel="stylesheet" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
|
||||||
|
|
||||||
|
<body class="center-screen">
|
||||||
|
<div class="centered">
|
||||||
|
<h1>Deine Auswahl fließt nun in die Wahl ein!</h1>
|
||||||
|
<h2>Danke fürs abstimmen!</h2>
|
||||||
|
<button id="backButton" class="submitButton">Zurück zum Anfang</button>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.getElementById("backButton").onclick = function() {
|
||||||
|
location.href = "/";
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
$('#votingButtons div.voteDiv:nth-child(' + q + ')').hide();
|
$('#votingButtons div.voteDiv:nth-child(' + q + ')').hide();
|
||||||
$('#votingButtons div.voteDiv:nth-child(' + (q + 1) + ')').show();
|
$('#votingButtons div.voteDiv:nth-child(' + (q + 1) + ')').show();
|
||||||
if (q == (qMax - 1)) {
|
if (q == (qMax - 1)) {
|
||||||
$('#btnNext').html('Submit Answers');
|
$('#btnNext').html('Auswahl bestätigen');
|
||||||
}
|
}
|
||||||
q++;
|
q++;
|
||||||
} else {
|
} else {
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="submitButton" id="btnNext" type="submit">Nächste Frage</button>
|
<button class="submitButton" id="btnNext" type="submit">Nächste Kategorie</button>
|
||||||
<form action="#" th:action="@{/processVote}" method="post" id="myForm">
|
<form action="#" th:action="@{/processVote}" method="post" id="myForm">
|
||||||
<input id="voteValues" type="hidden" name="voteValues" value="" />
|
<input id="voteValues" type="hidden" name="voteValues" value="" />
|
||||||
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
<input id="voterName" type="hidden" name="name" th:value="${name}" />
|
||||||
|
|||||||
Reference in New Issue
Block a user