16 Commits

Author SHA1 Message Date
0518c1c809 mqtt improvements
new device page
2020-01-10 16:38:18 +01:00
c44a0dd9ec Merge remote-tracking branch 'origin/master' 2019-12-13 16:30:14 +01:00
28d5ba0b03 readymqtt.3 2019-12-13 16:29:43 +01:00
7ca16400d4 Merge remote-tracking branch 'origin/master' 2019-12-13 16:27:02 +01:00
a1b3998890 favicon
port error
2019-12-13 16:26:53 +01:00
27c2b9ceb4 readymqtt.3 2019-12-13 15:45:25 +01:00
3a82f81c1a Merge remote-tracking branch 'origin/master' 2019-12-13 15:05:39 +01:00
1ef61f13ab readymqtt.2 2019-12-13 15:04:53 +01:00
e26258c3cf Merge remote-tracking branch 'origin/master' 2019-12-13 14:58:13 +01:00
b1e7de952a * total cities label
* color and icon improvements
2019-12-13 14:57:59 +01:00
89426cfcee readymqtt 2019-12-13 13:55:32 +01:00
e4f9d88cda asdf 2019-12-13 11:36:26 +01:00
ab1ce79900 * optimized Sout calls to Logs 2019-12-13 11:25:41 +01:00
f32dbd802b * finished date table
* proper selection when creating new date
2019-12-13 11:12:21 +01:00
23bffc4c6e * save start time
* memory utilisation
2019-12-12 12:39:28 +01:00
97214d786e * generate build time property in gradle file 2019-12-11 13:17:55 +01:00
20 changed files with 715 additions and 238 deletions

1
.idea/gradle.xml generated
View File

@ -6,6 +6,7 @@
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="GRADLE" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="11" />

2
.idea/misc.xml generated
View File

@ -4,7 +4,7 @@
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_13" default="true" project-jdk-name="13" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,9 +1,11 @@
import java.text.SimpleDateFormat
plugins {
id 'java'
}
group 'com.wasteinformationserver'
version '0.1-Beta'
version '0.2.1-Beta'
sourceCompatibility = 1.8
@ -39,6 +41,7 @@ task createProperties(dependsOn: processResources) {
new File("$projectDir/src/resources/version.properties").withWriter { w ->
Properties p = new Properties()
p['version'] = project.version.toString()
p['buildtime'] = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())
p.store w, null
}
}

View File

@ -1,35 +1,58 @@
package com.wasteinformationserver.basicutils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
public class Info {
public static String version="0.0";
public static String builddate;
private static String version="not init";
private static String builddate="not init";
private static String starttime="not init";
public static String getVersion() {
return version;
}
public static String getBuilddate() {
return builddate;
}
public static String getStarttime() {
return starttime;
}
public static void init(){
starttime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date());
Properties prop = new Properties();
try {
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
URL url = Info.class.getResource("/version.properties");
String builddatee = format.format(new Date(new File(url.toURI()).lastModified()));
builddate=builddatee;
prop.load(url.openStream());
version=(String)prop.get("version");
builddate=(String)prop.get("buildtime");
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
public static void getMemoryUsage(){
Runtime runtime = Runtime.getRuntime();
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("free memory: " + format.format(freeMemory / 1024) + "\n");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "\n");
sb.append("max memory: " + format.format(maxMemory / 1024) + "\n");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "\n");
System.out.println(sb.toString());
}
}

View File

@ -1,5 +1,4 @@
package com.wasteinformationserver.db;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;

View File

@ -5,14 +5,16 @@ import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import com.wasteinformationserver.mqtt.mqtt;
import com.wasteinformationserver.website.Webserver;
import java.io.IOException;
public class main {
public static void main(String[] args) {
Log.setLevel(Log.DEBUG);
Log.setLevel(Log.INFO);
Log.info("startup of WasteInformationServer");
Log.info("mem: "+Runtime.getRuntime().totalMemory());
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
@ -26,15 +28,15 @@ public class main {
}));
Info.init();
Log.info("Server version: "+Info.version);
Log.debug("Build date: "+Info.builddate);
Log.info("Server version: " + Info.getVersion());
Log.debug("Build date: " + Info.getBuilddate());
//initial connect to db
Log.message("initial login to db");
new Thread(() -> {
try {
JDCB.init("ingproject", "Kb9Dxklumt76ieq6", "ingproject", "db.power4future.at", 3306);
//JDCB.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
//JDCB.init("users", "admin0", "wasteinformation", "192.168.65.15", 1883);
JDCB.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
} catch (IOException e) {
//e.printStackTrace();
Log.error("no connection to db");
@ -53,7 +55,9 @@ public class main {
mqtt m = new mqtt();
m.notifymessage();
} catch (Exception e) {
Log.debug("An error was happened in the class mqtt");
Log.error("An error occured in the class mqtt");
}
Log.info("mem: "+Runtime.getRuntime().totalMemory());
}
}
}

View File

@ -1,4 +0,0 @@
package com.wasteinformationserver.mqtt;
public class Database {
}

View File

@ -27,11 +27,10 @@ public class mqtt {
public void notifymessage() {
try {
client = new MqttClient("tcp://192.168.65.15:1883", "JavaSample");
client = new MqttClient("tcp://192.168.65.15:1883", "JavaSample42");
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
client.connect(connOpts);
} catch (MqttException e) {
Log.error("Connection to the ESB was failed");
}
@ -40,10 +39,10 @@ public class mqtt {
mr.addMessageReceivedListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = e.getActionCommand();
String[] split = temp.split(",");
getDatabasedata("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=(SELECT cities.zone FROM cities WHERE cities.name='" + split[1] + "' AND cities.wastetype='" + split[2] + "' AND cities.zone=" + split[3] + ")", split[2], Integer.parseInt(split[0]));
Log.debug("received message");
String[] split = e.getActionCommand().split(",");
String wastetyp = getTyp(Integer.parseInt(split[2]));
getDatabasedata("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=(SELECT cities.zone FROM cities WHERE cities.name='" + split[1] + "' AND cities.wastetype='" + wastetyp + "' AND cities.zone=" + split[3] + ")", wastetyp, Integer.parseInt(split[0]));
}
});
mr.getmessage();
@ -52,54 +51,44 @@ public class mqtt {
public void getDatabasedata(String message, String wastetyp, int clientidentify) {
Log.debug(message);
Log.debug(wastetyp);
Log.debug(clientidentify);
JDCB Database = null;
try {
Database = JDCB.getInstance();
} catch (IOException e) {
Log.error("No Connection to the databank");
}
//new JDCB("placeuser", "eaL956R6yFItQVBl", "wasteinformation");
int wastenumber = getIntTyp(wastetyp);
ResultSet result = Database.executeQuery(message);
try {
if (!result.isBeforeFirst()) {
int abholtag = 0;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
} else {
while (result.next()) {
String temptime = String.valueOf(result.getString("pickupdate"));
GregorianCalendar now = new GregorianCalendar();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG);
String date = df.format(now.getTime());
String[] parts = temptime.split("-");
String tempyear = parts[0];
String[] yearsplit = tempyear.split("0");
String tempyearnew = yearsplit[1];
String newDate = parts[2] + "." + parts[1] + ".20" + tempyearnew;
String[] partstwo = date.split(" ");
String Datetomorrow = nexDayDate();
int abholtag;
if (partstwo[0].contains(newDate) || partstwo[0].contains(Datetomorrow)) {
abholtag = 1;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
} else {
abholtag = 0;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
}
result.last();
if (result.getFetchSize() == 0){
//if not found in db --> send zero
transmitmessageAbfallart(clientidentify + "," + wastenumber + "," + 0);
}
result.first();
while (result.next()) {
String newDate = getDateDatabase(String.valueOf(result.getString("pickupdate")));
String currentDate = getcurrentDate();
String Datetomorrow = nexDayDate();
if (currentDate.equals(newDate) || currentDate.equals(Datetomorrow)) {
transmitmessageAbfallart(clientidentify + "," + wastenumber + "," + 1);
} else {
transmitmessageAbfallart(clientidentify + "," + wastenumber + "," + 0);
}
}
} catch (SQLException e) {
Log.error("No data from database");
}
}
private void transmitmessageAbfallart(String temp) {
Log.debug("sending message >>>"+temp);
mqtttransmitter mt = new mqtttransmitter(client);
Log.debug(temp);
mt.sendmessage(temp);
@ -117,7 +106,49 @@ public class mqtt {
String temp = dateFormat.format(currentDatePlusOne);
String split[] = temp.split("/");
String newDate = split[2] + "." + split[1] + "." + split[0];
return newDate;
return split[2] + "." + split[1] + "." + split[0];
}
private String getTyp(int number) {
if (number == 1) {
return "Plastic";
} else if (number == 2) {
return "Metal";
} else if (number == 3) {
return "Residual waste";
} else if (number == 4) {
return "Biowaste";
}
return null;
}
private int getIntTyp(String temp) {
int number = 0;
if (temp.equals("Plastic")) {
number = 1;
} else if (temp.equals("Metal")) {
number = 2;
} else if (temp.equals("Residual waste")) {
number = 3;
} else if (temp.equals("Biowaste")) {
number = 4;
}
return number;
}
private String getDateDatabase(String temptime) {
String[] parts = temptime.split("-");
String tempyear = parts[0];
String[] yearsplit = tempyear.split("0");
String tempyearnew = yearsplit[1];
return parts[2] + "." + parts[1] + "." + tempyearnew;
}
private String getcurrentDate() {
GregorianCalendar now = new GregorianCalendar();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG);
String date = df.format(now.getTime());
String[] partstwo = date.split(",");
return partstwo[0];
}
}

View File

@ -29,6 +29,7 @@ public class mqttreceiver {
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
message = new String(mqttMessage.getPayload());
Log.info("received Request from PCB");
notifylisteners(message);
}
@ -41,7 +42,7 @@ public class mqttreceiver {
client.subscribe("TopicIn");
Log.debug("subscribed topic");
} catch (MqttException e) {
Log.error("Connection to the ESB was failed");
Log.error("Connection to the ESB failed");
}
return message;
}

View File

@ -10,90 +10,33 @@ import com.wasteinformationserver.website.datarequests.login.CheckLoginState;
import com.wasteinformationserver.website.datarequests.login.LoginRequest;
import java.io.IOException;
import java.net.BindException;
import java.net.InetSocketAddress;
public class Webserver {
public void startserver() {
Log.info("starting Webserver");
HttpServer server = null;
try {
server = HttpServer.create(new InetSocketAddress(8000), 0);
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/", new MainPage());
server.createContext("/senddata/loginget", new LoginRequest());
server.createContext("/senddata/registerpost", new RegisterRequest());
server.createContext("/senddata/checkloginstate", new CheckLoginState());
server.createContext("/senddata/wastedata", new DataRequest());
server.createContext("/senddata/admindata", new AdminRequests());
server.createContext("/senddata/newdate", new NewDateRequest());
server.setExecutor(null); // creates a default executor
server.start();
Log.info("Server available at http://127.0.0.1:8000 now");
} catch (BindException e) {
Log.criticalerror("The Port 8000 is already in use!");
} catch (IOException e) {
e.printStackTrace();
}
server.createContext("/", new MainPage());
server.createContext("/senddata/loginget", new LoginRequest());
server.createContext("/senddata/registerpost", new RegisterRequest());
server.createContext("/senddata/checkloginstate", new CheckLoginState());
server.createContext("/senddata/wastedata", new DataRequest());
server.createContext("/senddata/admindata", new AdminRequests());
server.createContext("/senddata/newdate", new NewDateRequest());
server.setExecutor(null); // creates a default executor
server.start();
Log.info("Server available at http://127.0.0.1:8000 now");
/*
try {
server = HttpsServer.create(new InetSocketAddress(8000), 0);
// initialise the HTTPS server
SSLContext sslContext = SSLContext.getInstance("TLS");
// initialise the keystore
char[] password = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("testkey.jks");
ks.load(fis, password);
// setup the key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
// setup the trust manager factory
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
// setup the HTTPS context and parameters
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
public void configure(HttpsParameters params) {
try {
// initialise the SSL context
SSLContext context = getSSLContext();
SSLEngine engine = context.createSSLEngine();
params.setNeedClientAuth(false);
params.setCipherSuites(engine.getEnabledCipherSuites());
params.setProtocols(engine.getEnabledProtocols());
// Set the SSL parameters
SSLParameters sslParameters = context.getSupportedSSLParameters();
params.setSSLParameters(sslParameters);
} catch (Exception ex) {
System.out.println("Failed to create HTTPS port");
}
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
*/
}
}

View File

@ -1,5 +1,6 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.File;
@ -27,7 +28,7 @@ public class AdminRequests extends PostRequest {
/* is it a jar file? */
if (!currentJar.getName().endsWith(".jar"))
System.out.println("not jar");
Log.warning("not jar --> cant restart");
/* Build command: java -jar application.jar */
final ArrayList<String> command = new ArrayList<String>();

View File

@ -17,6 +17,8 @@ public class DataRequest extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
StringBuilder sb = new StringBuilder();
ResultSet set = null;
int status = -1;
JDCB jdcb;
try {
@ -33,7 +35,7 @@ public class DataRequest extends PostRequest {
// check if wastezone and wasteregion already exists
Log.debug(params.get("cityname") + params.get("wastetype") + params.get("wastezone"));
ResultSet set = jdcb.executeQuery("select * from `cities` where `name`='" + params.get("cityname") + "' AND `wastetype`='" + params.get("wastetype") + "' AND `zone`='" + params.get("wastezone") + "'");
set = jdcb.executeQuery("select * from `cities` where `name`='" + params.get("cityname") + "' AND `wastetype`='" + params.get("wastetype") + "' AND `zone`='" + params.get("wastezone") + "'");
int size = 0;
try {
if (set != null) {
@ -45,14 +47,12 @@ public class DataRequest extends PostRequest {
}
if (size == 0) {
//doesnt exist
System.out.println("doesnt exist");
int status = 0;
try {
status = jdcb.executeUpdate("INSERT INTO `cities`(`userid`, `name`, `wastetype`, `zone`) VALUES ('0','" + params.get("cityname") + "','" + params.get("wastetype") + "','" + params.get("wastezone") + "');");
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(status);
if (status == 1) {
sb.append("\"status\" : \"inserted\"");
} else {
@ -64,7 +64,6 @@ public class DataRequest extends PostRequest {
sb.append("\"status\" : \"exists\"");
} else {
//already exists
System.out.println("already exists");
sb.append("\"status\" : \"exists\"");
}
@ -72,20 +71,18 @@ public class DataRequest extends PostRequest {
sb.append("}");
break;
case "getAllCities":
ResultSet sett = jdcb.executeQuery("select * from cities");
Log.debug(sett.toString());
set = jdcb.executeQuery("select * from cities");
Log.debug(set.toString());
sb.append("{\"data\":[");
try {
while (sett.next()) {
sb.append("{\"cityname\":\"" + sett.getString("name") + "\"");
sb.append(",\"wastetype\":\"" + sett.getString("wastetype") + "\"");
sb.append(",\"id\":\"" + sett.getString("id") + "\"");
sb.append(",\"zone\":\"" + sett.getString("zone") + "\"}");
if (!sett.isLast()) {
while (set.next()) {
sb.append("{\"cityname\":\"" + set.getString("name") + "\"");
sb.append(",\"wastetype\":\"" + set.getString("wastetype") + "\"");
sb.append(",\"id\":\"" + set.getString("id") + "\"");
sb.append(",\"zone\":\"" + set.getString("zone") + "\"}");
if (!set.isLast()) {
sb.append(",");
}
// System.out.println(sett.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
@ -97,8 +94,6 @@ public class DataRequest extends PostRequest {
case "deletecity":
//DELETE FROM `cities` WHERE `id`=0
sb.append("{");
Log.debug(params.get("id"));
int status = 0;
try {
status = jdcb.executeUpdate("DELETE FROM `cities` WHERE `id`='" + params.get("id") + "'");
if (status == 1) {
@ -121,49 +116,41 @@ public class DataRequest extends PostRequest {
sb.append("}");
break;
case "getcollectionnumber": //todo maybe combine all three to one
sb.append("{");
case "getAllDates":
set = jdcb.executeQuery("SELECT pickupdates.id,pickupdates.pickupdate,cities.userid,cities.name,cities.wastetype,cities.zone " +
"FROM `pickupdates` INNER JOIN `cities` ON pickupdates.citywastezoneid = cities.id");
sb.append("{\"data\":[");
try {
ResultSet settt = jdcb.executeQuery("select * from pickupdates");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
while (set.next()) {
sb.append("{\"date\":\"" + set.getString("pickupdate") + "\"");
sb.append(",\"cityname\":\"" + set.getString("name") + "\"");
sb.append(",\"wastetype\":\"" + set.getString("wastetype") + "\"");
sb.append(",\"id\":\"" + set.getString("id") + "\"");
sb.append(",\"zone\":\"" + set.getString("zone") + "\"}");
if (!set.isLast()) {
sb.append(",");
}
}
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getcollectioninfuture":
case "deletedate":
sb.append("{");
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String time = sdf.format(date);
ResultSet settt = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '"+time+"' AND '2222-12-27'");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getfinishedcollections":
sb.append("{");
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String time = sdf.format(date);
ResultSet settt = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '0000-12-27' AND '"+time+"'");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
status = jdcb.executeUpdate("DELETE FROM `pickupdates` WHERE `id`='" + params.get("id") + "'");
if (status == 1) {
//success
sb.append("\"status\" : \"success\"");
} else {
sb.append("\"status\" : \"error\"");
}
} catch (SQLIntegrityConstraintViolationException e) {
Log.warning("dependencies of deletion exist");
sb.append("\"status\" : \"dependenciesnotdeleted\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
@ -175,10 +162,45 @@ public class DataRequest extends PostRequest {
case "getversionandbuildtime":
sb.append("{");
sb.append("\"version\" : \""+ Info.version+"\"");
sb.append(",\"buildtime\" : \""+ Info.builddate+"\"");
sb.append("\"version\" : \""+ Info.getVersion()+"\"");
sb.append(",\"buildtime\" : \""+ Info.getBuilddate()+"\"");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getStartHeaderData":
sb.append("{");
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String time = sdf.format(date);
set = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '0000-12-27' AND '"+time+"'");
set.last();
sb.append("\"finshedcollections\":\"" + set.getRow() + "\"");
sdf = new SimpleDateFormat("yyyy-MM-dd");
date = new Date();
date = new Date(date.getTime()+1 * 24 * 60 * 60 * 1000);
time = sdf.format(date);
set = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '"+time+"' AND '2222-12-27'");
set.last();
sb.append(",\"futurecollections\":\"" + set.getRow() + "\"");
set = jdcb.executeQuery("select * from pickupdates");
set.last();
sb.append(",\"collectionnumber\":\"" + set.getRow() + "\"");
set = jdcb.executeQuery("select * from `cities`");
set.last();
sb.append(",\"citynumber\":\"" + set.getRow() + "\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;

View File

@ -14,6 +14,7 @@ public class NewDateRequest extends PostRequest {
public String request(HashMap<String, String> params) {
StringBuilder sb = new StringBuilder();
JDCB jdcb;
ResultSet set;
try {
jdcb = JDCB.getInstance();
} catch (IOException e) {
@ -22,21 +23,21 @@ public class NewDateRequest extends PostRequest {
}
switch (params.get("action")) {
case "getCitynames":
ResultSet sett = jdcb.executeQuery("select * from cities");
Log.debug(sett.toString());
set = jdcb.executeQuery("select * from cities");
Log.debug(set.toString());
sb.append("{\"data\":[");
try {
String prev = "";
while (sett.next()) {
if (prev.equals(sett.getString("name"))) {
while (set.next()) {
if (prev.equals(set.getString("name"))) {
} else {
if (!sett.isFirst()) {
if (!set.isFirst()) {
sb.append(",");
}
sb.append("{\"cityname\":\"" + sett.getString("name") + "\"}");
sb.append("{\"cityname\":\"" + set.getString("name") + "\"}");
}
prev = sett.getString("name");
prev = set.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
@ -47,7 +48,7 @@ public class NewDateRequest extends PostRequest {
Log.debug(sb.toString());
break;
case "getzones":
ResultSet set = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' ORDER BY zone ASC");
set = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' ORDER BY zone ASC");
Log.debug(set.toString());
sb.append("{\"data\":[");
try {
@ -70,16 +71,40 @@ public class NewDateRequest extends PostRequest {
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "gettypes":
set = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='"+params.get("zonename")+"' ORDER BY zone ASC");
Log.debug(set.toString());
sb.append("{\"data\":[");
try {
String prev = "42";
while (set.next()) {
if (prev == set.getString("wastetype")) {
} else {
sb.append("{\"wastetype\":\"" + set.getString("wastetype") + "\"}");
if (!set.isLast()) {
sb.append(",");
}
}
prev = set.getString("wastetype");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "newdate":
sb.append("{");
Log.debug(params);
ResultSet seti = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='" + params.get("zone") + "' AND `wastetype`='" + params.get("wastetype") + "'");
set = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='" + params.get("zone") + "' AND `wastetype`='" + params.get("wastetype") + "'");
try {
seti.last();
if (seti.getRow() == 1) {
Log.debug(seti.getInt("id"));
set.last();
if (set.getRow() == 1) {
Log.debug(set.getInt("id"));
int status = jdcb.executeUpdate("INSERT INTO `pickupdates`(`citywastezoneid`, `pickupdate`) VALUES ('" + seti.getInt("id") + "','" + params.get("date") + "')");
int status = jdcb.executeUpdate("INSERT INTO `pickupdates`(`citywastezoneid`, `pickupdate`) VALUES ('" + set.getInt("id") + "','" + params.get("date") + "')");
if (status == 1) {
sb.append("\"status\" : \"success\"");
} else {

View File

@ -37,6 +37,8 @@
<link rel="stylesheet" type="text/css" href="css/dashboard.css">
<link rel="stylesheet" type="text/css" href="css/general.css">
<link rel="icon" type="image/png" href="/favicon.png">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
@ -96,6 +98,15 @@
</p>
</a>
</li>
<li id="devicepanel" class="nav-item">
<a href="device.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
Devices
</p>
</a>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
@ -145,14 +156,14 @@
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-success">
<div class="small-box bg-gray">
<div class="inner">
<h3>53<sup style="font-size: 20px">%</sup></h3>
<h3 id="total-city-number-label">42</h3>
<p>Verbundene Clients</p>
<p>total collect zones</p>
</div>
<div class="icon">
<i class="ion ion-stats-bars"></i>
<i class="ion ion-android-globe" style="color: lightgrey"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
@ -167,7 +178,7 @@
<p>Planned Collections</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
<i class="ion ion-calendar"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
@ -175,14 +186,14 @@
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-danger">
<div class="small-box bg-success">
<div class="inner">
<h3 id="finished-collection-label">65</h3>
<p>Finished Collections</p>
</div>
<div class="icon">
<i class="ion ion-pie-graph"></i>
<i class="ion ion-android-checkmark-circle"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
@ -311,11 +322,7 @@
data-toggle="dropdown">
Select waste type
</button>
<div class="dropdown-menu">
<a class="dropdown-item-wastetype dropdown-item" href="#">Plastic</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Metal</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Residual waste</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Biowaste</a>
<div id="dropdown-type-drops" class="dropdown-menu">
</div>
</div>
<input id="input-wastetime" style="width: 50px;" class="form-control" id="date"

View File

@ -0,0 +1,317 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- iCheck -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- JQVMap -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/jqvmap/jqvmap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css">
<!-- overlayScrollbars -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Daterange picker -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/daterangepicker/daterangepicker.css">
<!-- summernote -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/summernote/summernote-bs4.css">
<!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<!-- Bootstrap Date-Picker Plugin -->
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- <link rel="stylesheet" type="text/css" href="css/user.css">-->
<link rel="stylesheet" type="text/css" href="css/general.css">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="dashboard.html" class="brand-link">
<img src="lib/AdminLTE/dist/img/AdminLTELogo.png" alt="AdminLTE Logo"
class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">Waste Control</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> -->
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div>
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> -->
<div class="info">
<a href="user.html" class="d-block" id="userlabel">Username to set!</a>
</div>
</div>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> -->
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div>
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> -->
<div class="info">
<a href="user.html" class="d-block" id="userlabel">Username to set!</a>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
data-accordion="false">
<li class="nav-item">
<a href="#todo" class="nav-link">
<i class="nav-icon fas fa-cog"></i>
<p>
Settings
</p>
</a>
</li>
<li class="nav-item">
<a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
<p>
Logout
</p>
</a>
</li>
<li id="adminpanel" class="nav-item hideit">
<a href="adminpanel.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
Admin panel
</p>
</a>
</li>
<li id="devicepanel" class="nav-item">
<a href="device.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
Devices
</p>
</a>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark">Dashboard</h1>
</div><!-- /.col -->
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="dashboard.html">Home</a></li>
<li class="breadcrumb-item active">Users</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<!-- Small boxes (Stat box) -->
<div class="row">
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-info">
<div class="inner">
<h3>150</h3>
<p>Todo</p>
</div>
<div class="icon">
<i class="ion ion-bag"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-success">
<div class="inner">
<h3>42</h3>
<p>Devices</p>
</div>
<div class="icon">
<i class="ion ion-stats-bars"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
</div>
<!-- /.row -->
<!-- Main row -->
<div class="row">
<!-- Left col -->
<section class="col-lg-7 connectedSortable">
<!-- Custom tabs (Charts with tabs)-->
<div class="card">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-chart-pie mr-1"></i>
User Data
</h3>
<button id="btn-newdevice" type="button" class="btn btn-success"
style="float:right;">Save
</button>
</div><!-- /.card-header -->
<div class="card-body">
<div class="form-group" style="margin-top: 15px; width: 10cm;">
<!-- todo todo -->
<label for="new_city_cityname">City/Village name</label>
<input type="email" class="form-control" id="new_city_cityname"
aria-describedby="emailHelp" placeholder="Enter city name here">
<small class="form-text text-muted">Please try to use no special
characters</small>
</div>
<div class="form-group" style="width: 10cm;">
<label for="new_city_zonename">Zone Name</label>
<input type="email" class="form-control" id="new_city_zonename"
aria-describedby="emailHelp" placeholder="Enter Zone name here">
<small class="form-text text-muted">Please try to use no special
characters</small>
</div>
<div class="input-group-prepend">
<button id="dropdown-wastetype" type="button"
class="btn btn-outline-dark dropdown-toggle"
data-toggle="dropdown">
Select waste type
</button>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Plastic</a>
<a class="dropdown-item" href="#">Metal</a>
<a class="dropdown-item" href="#">Residual waste</a>
<a class="dropdown-item" href="#">Biowaste</a>
</div>
</div>
</div><!-- /.card-body -->
</div>
</section>
<!-- /.Left col -->
<!-- right col (We are only adding the ID to make the widgets sortable)-->
<section class="col-lg-5 connectedSortable">
<!-- /.card -->
</section>
<!-- right col -->
</div>
<!-- /.row (main row) -->
</div><!-- /.container-fluid -->
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
<footer class="main-footer">
<strong>By Gregor Dutzler & Lukas Heiligenbrunner & Emil Meindl</strong>
<div class="float-right d-none d-sm-inline-block">
<b>Version</b> 3.0.0
<b>Build</b> 2019-8-8 9:30
</div>
</footer>
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
</aside>
<!-- /.control-sidebar -->
</div>
<!-- ./wrapper -->
<!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
<script src="lib/AdminLTE/plugins/jquery-ui/jquery-ui.min.js"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
$.widget.bridge('uibutton', $.ui.button)
</script>
<!-- Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- ChartJS -->
<script src="lib/AdminLTE/plugins/chart.js/Chart.min.js"></script>
<!-- Sparkline -->
<script src="lib/AdminLTE/plugins/sparklines/sparkline.js"></script>
<!-- JQVMap -->
<script src="lib/AdminLTE/plugins/jqvmap/jquery.vmap.min.js"></script>
<script src="lib/AdminLTE/plugins/jqvmap/maps/jquery.vmap.usa.js"></script>
<!-- jQuery Knob Chart -->
<script src="lib/AdminLTE/plugins/jquery-knob/jquery.knob.min.js"></script>
<!-- daterangepicker -->
<script src="lib/AdminLTE/plugins/moment/moment.min.js"></script>
<script src="lib/AdminLTE/plugins/daterangepicker/daterangepicker.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Summernote -->
<script src="lib/AdminLTE/plugins/summernote/summernote-bs4.min.js"></script>
<!-- overlayScrollbars -->
<script src="lib/AdminLTE/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<script src="lib/AdminLTE/dist/js/pages/dashboard.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<!--<script type="text/javascript" src="js/user.js"></script>-->
<!-- DataTables -->
<script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script>
<script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
<script src="js/device.js"></script>
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -13,21 +13,15 @@ $(document).ready(function () {
}, 'json');
//load total collections
$.post('/senddata/wastedata', 'action=getcollectionnumber', function (data) {
$.post('/senddata/wastedata', 'action=getStartHeaderData', function (data) {
console.log(data);
$("#total-connection-labels").html(data.collectionnumber);
}, 'json');
//load future collections
$.post('/senddata/wastedata', 'action=getcollectioninfuture', function (data) {
console.log(data);
$("#planed-collection-label").html(data.collectionnumber);
}, 'json');
$("#planed-collection-label").html(data.futurecollections);
//load future collections
$.post('/senddata/wastedata', 'action=getfinishedcollections', function (data) {
console.log(data);
$("#finished-collection-label").html(data.collectionnumber);
$("#finished-collection-label").html(data.finshedcollections);
$("#total-city-number-label").html(data.citynumber);
}, 'json');
//load version footer
@ -38,6 +32,7 @@ $(document).ready(function () {
var citytable;
var datetable;
function reloadtable() {
$.post('/senddata/wastedata', 'action=getAllCities', function (data) {
@ -108,14 +103,63 @@ $(document).ready(function () {
}
var DataTable;
function reloadDateTable() {
$.post('/senddata/wastedata', 'action=getAllDates', function (data) {
if (DataTable != null) {
DataTable.destroy(); //delete table if already created
if (datetable != null) {
datetable.destroy(); //delete table if already created
}
console.log(data);
//todo
if (data.query == "ok") {
$('#picupdates-tablebody').html("");
$(".delbtndate").off();
for (var i = 0; i < data.data.length; i++) {
$('#picupdates-tablebody').append("<tr>" +
"<td>" + data.data[i].cityname + "</td>" +
"<td>" + data.data[i].zone + "</td>" +
"<td>" + data.data[i].wastetype + "</td>" +
"<td>" + data.data[i].date + "</td>" +
"<td>" + "<button dataid='" + data.data[i].id + "' type='button' class='delbtndate btn btn-danger'>X</button>" + "</td>" +
"</tr>");
}
$(".delbtndate").click(function (event) {
var id = event.target.getAttribute("dataid");
console.log("clicked btn data " + id);
$.post('/senddata/wastedata', 'action=deletedate&id=' + id, function (data) {
console.log(data);
if (data.status == "success") {
Swal.fire({
type: "success",
title: 'Successfully deleted city!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
reloadDateTable();
} else if (data.status == "dependenciesnotdeleted") {
Swal.fire({
type: "warning",
title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => {
console.log('Popup closed. ')
});
//todo set yes no button here
}
}, "json");
});
}
datetable = $("#table-pickupdates").DataTable({
"order": [[ 3, "asc" ]]
} );
//todo picupdates-tablebody
},"json");
}
@ -223,9 +267,31 @@ $(document).ready(function () {
});
});
$(".dropdown-item-wastetype").click(function (event) {
$("#dropdown-type-data").click(function (event) {
event.preventDefault();
$("#dropdown-type-data").html($(this).html());
var dropdata = $("#dropdown-type-drops");
dropdata.html("");
console.log("clickeeeed");
$.post('/senddata/newdate', 'action=gettypes&cityname=' + $("#dropdown-city").html()+'&zonename='+$("#dropdown-zone").html(), function (data) {
console.log(data);
if (data.query == "ok") {
for (var i = 0; i < data.data.length; i++) {
var type = data.data[i].wastetype;
dropdata.append("<a class=\"dropdown-data-typename dropdown-item\" href=\"#\">" + type + "</a>");
}
$(".dropdown-data-typename").off();
$(".dropdown-data-typename").click(function (evnt) {
evnt.preventDefault();
$("#dropdown-type-data").html($(this).html());
});
}
});
});
@ -253,6 +319,7 @@ $(document).ready(function () {
zone.html("Select Zone");
wastetype.html("Select waste type");
date.val("");
reloadDateTable();
} else if (data.status == "citydoesntexist") {
Swal.fire({
type: "warning",

View File

@ -0,0 +1,37 @@
$(document).ready(function () {
$('#btn-newdevice').click(function (e) {
e.preventDefault();
Swal.showLoading({
title: 'No connection to Database',
html: 'Setup DB here --> <a href="index.html">click<a/>.',
});
// Swal.fire({
// type: "error",
// title: 'No connection to Database',
// html: 'Setup DB here --> <a href="index.html">click<a/>.',
// onBeforeOpen: () => {
// Swal.showLoading()
// },
// }).then((result) => {
// console.log('Popup closed. ')
//
// });
// $.post('/senddata/loginget', 'username=' + username + '&password=' + password, function (data) {
//
// console.log(data);
// if (data.status == "nodbconn"){
//
// }
// if (data.accept == true) {
// console.log("successfully logged in!");
// document.cookie = "username=" + username;
// window.location = 'dashboard.html';
// }
// }, 'json');
});
});

View File

@ -7,7 +7,7 @@
"description": "A web app to manage waste pickups",
"icons": [
{
"src": "wasteicon.png",
"src": "favicon.png",
"sizes": "512x512",
"type": "image/png"
}

View File

@ -10,7 +10,7 @@ const staticAssets = [
'/lib/jquery.min.js',
'/lib/popper.min.js',
'/rsc/login2.jpg',
'/wasteicon.png'
'/favicon.png'
];
self.addEventListener('install', async e => {