parent
89468525ab
commit
e5d55e04d9
|
@ -2,8 +2,6 @@
|
||||||
#Kundenkarten Analyse
|
#Kundenkarten Analyse
|
||||||
|
|
||||||
[![Build Status](https://teamcity.joethei.xyz/app/rest/builds/buildType:(id:Studium_Programmierung_Softwareprojektmanagement_SpmProd)/statusIcon)](https://tcstatus.joethei.space/dashboard/spm)
|
[![Build Status](https://teamcity.joethei.xyz/app/rest/builds/buildType:(id:Studium_Programmierung_Softwareprojektmanagement_SpmProd)/statusIcon)](https://tcstatus.joethei.space/dashboard/spm)
|
||||||
[![Quality Gate Status](https://sonarqube.joethei.xyz/api/project_badges/measure?project=de.hs-el.spm%3AbauDas-kundenkarten&metric=alert_status)](https://sonarqube.joethei.xyz/dashboard?id=de.hs-el.spm%3AbauDas-kundenkarten)
|
|
||||||
|
|
||||||
|
|
||||||
## minimal Requirements
|
## minimal Requirements
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
SPM2019SS
|
|
@ -0,0 +1,19 @@
|
||||||
|
package de.hsel.spm.baudas;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* general .
|
||||||
|
*
|
||||||
|
* @author Johannes Theiner
|
||||||
|
* @version 0.1
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public class BauDas {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static Logger logger = Logger.getLogger("BauDas");
|
||||||
|
|
||||||
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
package de.hsel.spm.baudas.analysis;
|
package de.hsel.spm.baudas.analysis;
|
||||||
|
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import weka.core.Instances;
|
import weka.core.Instances;
|
||||||
import weka.core.converters.CSVLoader;
|
import weka.core.converters.CSVLoader;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* base interface for analysis.
|
* base interface for analysis.
|
||||||
|
@ -32,7 +32,7 @@ public interface Analysis<T> {
|
||||||
loader.setSource(file);
|
loader.setSource(file);
|
||||||
return loader.getDataSet();
|
return loader.getDataSet();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "load", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package de.hsel.spm.baudas.analysis;
|
package de.hsel.spm.baudas.analysis;
|
||||||
|
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import weka.clusterers.SimpleKMeans;
|
import weka.clusterers.SimpleKMeans;
|
||||||
import weka.core.Instances;
|
import weka.core.Instances;
|
||||||
|
@ -9,7 +10,6 @@ import weka.filters.unsupervised.attribute.Remove;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cluster Analysis.
|
* Cluster Analysis.
|
||||||
|
@ -47,7 +47,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
|
||||||
remove.setInputFormat(instances);
|
remove.setInputFormat(instances);
|
||||||
instances = Filter.useFilter(instances, remove);
|
instances = Filter.useFilter(instances, remove);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
//creating a single cluster to get average, weka has no way to get that from a bigger one.
|
//creating a single cluster to get average, weka has no way to get that from a bigger one.
|
||||||
|
@ -60,7 +60,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
|
||||||
averageCentroids = averageMeans.getClusterCentroids();
|
averageCentroids = averageMeans.getClusterCentroids();
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", ex);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), ex);
|
||||||
}
|
}
|
||||||
assert averageCentroids != null;
|
assert averageCentroids != null;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ public class Cluster implements Analysis<Map<Integer, Map<String, String>>> {
|
||||||
putIntoMap(centroids, count);
|
putIntoMap(centroids, count);
|
||||||
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", ex);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), ex);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package de.hsel.spm.baudas.analysis;
|
package de.hsel.spm.baudas.analysis;
|
||||||
|
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import weka.associations.Apriori;
|
import weka.associations.Apriori;
|
||||||
import weka.associations.AssociationRule;
|
import weka.associations.AssociationRule;
|
||||||
import weka.associations.Item;
|
import weka.associations.Item;
|
||||||
|
@ -13,7 +14,6 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The shopping-cart analysis.
|
* The shopping-cart analysis.
|
||||||
|
@ -46,7 +46,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
|
||||||
nc.setInputFormat(instances);
|
nc.setInputFormat(instances);
|
||||||
instances = Filter.useFilter(instances, nc);
|
instances = Filter.useFilter(instances, nc);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
|
||||||
num2nom.setInputFormat(instances);
|
num2nom.setInputFormat(instances);
|
||||||
instances = Filter.useFilter(instances, num2nom);
|
instances = Filter.useFilter(instances, num2nom);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Apriori model = new Apriori();
|
Apriori model = new Apriori();
|
||||||
|
@ -65,7 +65,7 @@ public class ShoppingCart implements Analysis<Map<List<String>, List<String>>> {
|
||||||
try {
|
try {
|
||||||
model.buildAssociations(instances);
|
model.buildAssociations(instances);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "getResult", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < model.getAssociationRules().getRules().size(); i++) {
|
for (int i = 0; i < model.getAssociationRules().getRules().size(); i++) {
|
||||||
|
|
|
@ -56,7 +56,8 @@ public class AuthorizationFilter implements Filter {
|
||||||
String url = req.getRequestURI();
|
String url = req.getRequestURI();
|
||||||
if (url.contains("login") || url.contains("logo") || url.contains("js/")) {
|
if (url.contains("login") || url.contains("logo") || url.contains("js/")) {
|
||||||
chain.doFilter(request, response);
|
chain.doFilter(request, response);
|
||||||
} else if (session == null || !((boolean) session.getAttribute("authentication"))) { //checking whether the session exists and if authentication succeed
|
} else if (session == null || session.getAttribute("authentication") == null
|
||||||
|
|| !((boolean) session.getAttribute("authentication"))) { //checking whether the session exists and if authentication succeed
|
||||||
this.context.log("Unauthorized access request");
|
this.context.log("Unauthorized access request");
|
||||||
res.sendRedirect(req.getContextPath() + "/login.jsp");
|
res.sendRedirect(req.getContextPath() + "/login.jsp");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package de.hsel.spm.baudas.web;
|
package de.hsel.spm.baudas.web;
|
||||||
|
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
@ -16,7 +17,6 @@ import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +31,8 @@ public class DatasetManagement {
|
||||||
@Getter
|
@Getter
|
||||||
private static ConcurrentMap<String, List<SavedFile>> files = new ConcurrentHashMap<>();
|
private static ConcurrentMap<String, List<SavedFile>> files = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private DatasetManagement() {}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adds file to list and generates a new filename.
|
* adds file to list and generates a new filename.
|
||||||
|
@ -50,7 +52,7 @@ public class DatasetManagement {
|
||||||
try {
|
try {
|
||||||
Files.delete(get(file.getUuid()).toPath());
|
Files.delete(get(file.getUuid()).toPath());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "add", e);
|
BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
files.get(session).remove(file);
|
files.get(session).remove(file);
|
||||||
}
|
}
|
||||||
|
@ -70,7 +72,7 @@ public class DatasetManagement {
|
||||||
try {
|
try {
|
||||||
Files.delete(get(file.getUuid()).toPath());
|
Files.delete(get(file.getUuid()).toPath());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", e);
|
BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
files.remove(session);
|
files.remove(session);
|
||||||
|
@ -87,13 +89,13 @@ public class DatasetManagement {
|
||||||
try {
|
try {
|
||||||
Files.delete(path);
|
Files.delete(path);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", e);
|
BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Logger.getLogger("BauDas").throwing(DatasetManagement.class.getName(), "delete", ex);
|
BauDas.getLogger().throwing(DatasetManagement.class.getName(), DatasetManagement.class.getEnclosingMethod().getName(), ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,6 +123,5 @@ public class DatasetManagement {
|
||||||
return uuid + ".csv";
|
return uuid + ".csv";
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatasetManagement() {
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -11,6 +11,8 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
import javax.servlet.http.HttpSession;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* authenticates users.
|
* authenticates users.
|
||||||
|
@ -23,8 +25,6 @@ import java.io.PrintWriter;
|
||||||
@WebServlet("/login")
|
@WebServlet("/login")
|
||||||
public class LoginServlet extends HttpServlet {
|
public class LoginServlet extends HttpServlet {
|
||||||
|
|
||||||
private final String password = "SPM2019SS";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reads from HTTP POST parameter 'password' and compares it.
|
* reads from HTTP POST parameter 'password' and compares it.
|
||||||
*
|
*
|
||||||
|
@ -34,17 +34,19 @@ public class LoginServlet extends HttpServlet {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void doPost(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws ServletException, IOException {
|
protected void doPost(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws ServletException, IOException {
|
||||||
|
String pw = Files.readString(Paths.get("password.txt"));
|
||||||
|
|
||||||
String password = request.getParameter("password");
|
String password = request.getParameter("password");
|
||||||
if (this.password.equals(password)) {
|
if (pw.equals(password)) {
|
||||||
HttpSession newSession = request.getSession(true);
|
HttpSession newSession = request.getSession(true);
|
||||||
newSession.setAttribute("authentication", true);
|
newSession.setAttribute("authentication", true);
|
||||||
newSession.setMaxInactiveInterval(5 * 60 * 60); //setting session to expiry in 5 hours
|
newSession.setMaxInactiveInterval(5 * 60 * 60); //setting session to expire in 5 hours
|
||||||
response.sendRedirect("/");
|
response.sendRedirect("index.jsp");
|
||||||
} else {
|
} else {
|
||||||
RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
|
RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp");
|
||||||
PrintWriter out = response.getWriter();
|
PrintWriter out = response.getWriter();
|
||||||
out.println("<font color='red' class='align-center'>Das eingegebene Passwort ist falsch.</font>");
|
|
||||||
rd.include(request, response);
|
rd.include(request, response);
|
||||||
|
out.print("<script>$('#wrong_password').removeClass('hide')</script>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package de.hsel.spm.baudas.web;
|
package de.hsel.spm.baudas.web;
|
||||||
|
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import weka.core.converters.CSVLoader;
|
import weka.core.converters.CSVLoader;
|
||||||
|
|
||||||
|
@ -17,7 +18,6 @@ import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* saves uploaded files.
|
* saves uploaded files.
|
||||||
|
@ -115,7 +115,7 @@ public class UploadServlet extends HttpServlet {
|
||||||
try {
|
try {
|
||||||
response.sendRedirect("error.jsp?code=" + code);
|
response.sendRedirect("error.jsp?code=" + code);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(getClass().getName(), "error", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package de.hsel.spm.baudas.web.depiction;
|
package de.hsel.spm.baudas.web.depiction;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
import de.hsel.spm.baudas.BauDas;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
@ -11,7 +12,6 @@ import java.io.PrintWriter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,7 +51,7 @@ interface Depiction {
|
||||||
}
|
}
|
||||||
return uuid;
|
return uuid;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.getLogger("BauDas").throwing(this.getClass().getName(), "init", e);
|
BauDas.getLogger().throwing(this.getClass().getName(), this.getClass().getEnclosingMethod().getName(), e);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
<% response.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
|
||||||
|
<% request.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||||
<!--Cards-->
|
<!--Cards-->
|
||||||
<!--Analyse-Cards-->
|
<!--Analyse-Cards-->
|
||||||
<div id="analysis" class="row container black-text">
|
<div id="analysis" class="row container black-text">
|
||||||
|
@ -62,7 +65,7 @@
|
||||||
<div id="group_overview" class="card white">
|
<div id="group_overview" class="card white">
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<div class="center">
|
<div class="center">
|
||||||
<span class="card-title center">Gruppenübersicht</span>
|
<span class="card-title center">Clusterübersicht</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<table id="cluster_table">
|
<table id="cluster_table">
|
||||||
|
|
|
@ -1,11 +1,20 @@
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"
|
||||||
|
integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
|
||||||
|
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
|
||||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/google-palette@1.1.0/palette.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/google-palette@1.1.0/palette.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
M.AutoInit();
|
M.AutoInit();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script src="js/upload.js"></script>
|
||||||
|
<script src="js/datasets.js"></script>
|
||||||
|
<script src="js/week_overview.js"></script>
|
||||||
|
<script src="js/shopping_times.js"></script>
|
||||||
|
<script src="js/sales.js"></script>
|
||||||
|
<script src="js/clusters.js"></script>
|
||||||
|
<script src="js/shopping_cart.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<!--Ende Skriptbereich-->
|
<!--Ende Skriptbereich-->
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -7,4 +7,4 @@
|
||||||
<%@include file="analysis.jsp"%>
|
<%@include file="analysis.jsp"%>
|
||||||
<%@include file="marketing.jsp"%>
|
<%@include file="marketing.jsp"%>
|
||||||
|
|
||||||
<%@include file="theming.jsp" %>
|
<%@include file="footer.jsp" %>
|
|
@ -24,7 +24,7 @@ Chart.plugins.register({
|
||||||
ctx.textAlign = 'center';
|
ctx.textAlign = 'center';
|
||||||
ctx.textBaseline = 'middle';
|
ctx.textBaseline = 'middle';
|
||||||
ctx.font = "16px normal 'Helvetica Nueue'";
|
ctx.font = "16px normal 'Helvetica Nueue'";
|
||||||
ctx.fillText('Kein Datenset ausgewählt', width / 2, height / 2);
|
ctx.fillText('Kein Datensatz ausgewählt', width / 2, height / 2);
|
||||||
ctx.restore();
|
ctx.restore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,13 @@ let sales = new Chart($("#sales_chart"), {
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
|
tooltips: {
|
||||||
|
callbacks: {
|
||||||
|
label: function (tooltipItems, data) {
|
||||||
|
return tooltipItems.xLabel + ' Stück';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
responsive: true,
|
responsive: true,
|
||||||
title: {
|
title: {
|
||||||
display: false
|
display: false
|
||||||
|
|
|
@ -22,17 +22,6 @@ form.onsubmit = function (event) {
|
||||||
loading.modal('open');
|
loading.modal('open');
|
||||||
};
|
};
|
||||||
|
|
||||||
xhr.upload.addEventListener("progress", function (event) {
|
|
||||||
if (event.lengthComputable) {
|
|
||||||
self.progress = Math.round(100 / event.total * event.loaded);
|
|
||||||
} else if (this.explicitTotal) {
|
|
||||||
self.progress = Math.min(1, event.loaded / self.explicitTotal);
|
|
||||||
} else {
|
|
||||||
self.progress = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
xhr.onloadend = function (e) {
|
xhr.onloadend = function (e) {
|
||||||
clearSelected();
|
clearSelected();
|
||||||
updateDatasets();
|
updateDatasets();
|
||||||
|
|
|
@ -17,22 +17,21 @@ let week_overview = new Chart($("#overview_chart"), {
|
||||||
yAxisID: 'y-axis-1',
|
yAxisID: 'y-axis-1',
|
||||||
data: [],
|
data: [],
|
||||||
fill: true,
|
fill: true,
|
||||||
backgroundColor: 'rgba(104, 216, 154, 0.5)',
|
backgroundColor: 'rgba(113, 114, 231, 1)',
|
||||||
lineTension: 0
|
lineTension: 0
|
||||||
}, {
|
}, {
|
||||||
label: "Einnahmen in €",
|
label: "Einnahmen in €",
|
||||||
yAxisID: 'y-axis-2',
|
yAxisID: 'y-axis-2',
|
||||||
data: [],
|
data: [],
|
||||||
fill: true,
|
fill: true,
|
||||||
backgroundColor: 'rgba(113, 114, 231, 1)',
|
backgroundColor: 'rgba(244, 67, 54, 1)',
|
||||||
lineTension: 0
|
lineTension: 0
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
responsive: true,
|
responsive: true,
|
||||||
title: {
|
title: {
|
||||||
display: false,
|
display: false
|
||||||
text: 'Übersicht'
|
|
||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
display: false
|
display: false
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<%@include file="emptyHeader.jsp" %>
|
<%@include file="emptyHeader.jsp" %>
|
||||||
|
|
||||||
<div class="container row">
|
<div class="container">
|
||||||
<!--Login-->
|
<div class="row">
|
||||||
<div class="center">
|
<div class="center">
|
||||||
<div class="card white col s6 push-s3">
|
<div class="card white col s6 push-s3">
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
|
@ -13,7 +13,8 @@
|
||||||
<div class="col s8 push-s2">
|
<div class="col s8 push-s2">
|
||||||
|
|
||||||
<form action="login" method="post">
|
<form action="login" method="post">
|
||||||
<input id="password" type="password" class="validate" placeholder="Passwort" name="password">
|
<input id="password" type="password" class="validate" placeholder="Passwort"
|
||||||
|
name="password">
|
||||||
<input class="white-text btn blue-grey lighten-2" type="submit" value="Login">
|
<input class="white-text btn blue-grey lighten-2" type="submit" value="Login">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,4 +24,15 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row hide" id="wrong_password">
|
||||||
|
<div class="col s4 push-s4">
|
||||||
|
<div class="card-panel red darken-1">
|
||||||
|
<h5 class="white-text center-align">
|
||||||
|
Das Passwort ist falsch
|
||||||
|
</h5>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<%@include file="footer.jsp" %>
|
<%@include file="footer.jsp" %>
|
|
@ -1,3 +1,6 @@
|
||||||
|
<% response.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
|
||||||
|
<% request.setCharacterEncoding(StandardCharsets.UTF_8.name()); %>
|
||||||
|
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||||
<!--Marketing-Cards-->
|
<!--Marketing-Cards-->
|
||||||
<div id="marketing" class="row container">
|
<div id="marketing" class="row container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
|
@ -71,7 +71,7 @@
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div class="col s12">
|
<div class="col s12 center">
|
||||||
<button class="btn blue-grey waves-effect waves-light" type="submit" name="action">Hochladen<i
|
<button class="btn blue-grey waves-effect waves-light" type="submit" name="action">Hochladen<i
|
||||||
class="material-icons right">file_upload</i></button>
|
class="material-icons right">file_upload</i></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
<!--Script für Diagramme-->
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"
|
|
||||||
integrity="sha256-xKeoJ50pzbUGkpQxDYHD7o7hxe0LaOGeguUidbq6vis=" crossorigin="anonymous"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
|
|
||||||
|
|
||||||
<script src="js/upload.js"></script>
|
|
||||||
<script src="js/datasets.js"></script>
|
|
||||||
<script src="js/week_overview.js"></script>
|
|
||||||
<script src="js/shopping_times.js"></script>
|
|
||||||
<script src="js/sales.js"></script>
|
|
||||||
<script src="js/clusters.js"></script>
|
|
||||||
<script src="js/shopping_cart.js"></script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<%@include file="footer.jsp"%>
|
|
Loading…
Reference in New Issue