From 1ac09ad02d01d0e44504d71caa273cf3d0f563ee Mon Sep 17 00:00:00 2001
From: oetrb <oetrb@github.com>
Date: Sun, 11 Oct 2020 22:58:56 +0200
Subject: [PATCH] added student

---
 package-lock.json               | 173 +++++++--------
 src/components/SideMenu.vue     |   3 +
 src/components/Student.vue      | 361 ++++++++++++++++++++++++++++++++
 src/models/student.js           |  19 ++
 src/router.js                   |   6 +
 src/services/student.service.js | 111 ++++++++++
 src/store/student.module.js     |  98 +++++++++
 src/store/teacher.module.js     |   1 -
 8 files changed, 687 insertions(+), 85 deletions(-)
 create mode 100644 src/components/Student.vue
 create mode 100644 src/models/student.js
 create mode 100644 src/services/student.service.js
 create mode 100644 src/store/student.module.js

diff --git a/package-lock.json b/package-lock.json
index 6c4e69a..2f1eb88 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1777,16 +1777,6 @@
           "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
           "dev": true
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
         "cacache": {
           "version": "13.0.1",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
@@ -1813,34 +1803,6 @@
             "unique-filename": "^1.1.1"
           }
         },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
         "find-cache-dir": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
@@ -1862,25 +1824,6 @@
             "path-exists": "^4.0.0"
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
         "locate-path": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -1945,16 +1888,6 @@
             "minipass": "^3.1.1"
           }
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
         "terser-webpack-plugin": {
           "version": "2.3.8",
           "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz",
@@ -1971,18 +1904,6 @@
             "terser": "^4.6.12",
             "webpack-sources": "^1.4.3"
           }
-        },
-        "vue-loader-v16": {
-          "version": "npm:vue-loader@16.0.0-beta.8",
-          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz",
-          "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "hash-sum": "^2.0.0",
-            "loader-utils": "^2.0.0"
-          }
         }
       }
     },
@@ -9249,11 +9170,6 @@
       "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
       "dev": true
     },
-    "qs": {
-      "version": "6.9.4",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
-      "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
-    },
     "query-string": {
       "version": "4.3.4",
       "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
@@ -9584,6 +9500,14 @@
         "tough-cookie": "~2.5.0",
         "tunnel-agent": "^0.6.0",
         "uuid": "^3.3.2"
+      },
+      "dependencies": {
+        "qs": {
+          "version": "6.5.2",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+          "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+          "dev": true
+        }
       }
     },
     "require-directory": {
@@ -11467,6 +11391,87 @@
         }
       }
     },
+    "vue-loader-v16": {
+      "version": "npm:vue-loader@16.0.0-beta.8",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz",
+      "integrity": "sha512-oouKUQWWHbSihqSD7mhymGPX1OQ4hedzAHyvm8RdyHh6m3oIvoRF+NM45i/bhNOlo8jCnuJhaSUf/6oDjv978g==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "loader-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "vue-password": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/vue-password/-/vue-password-3.0.0.tgz",
diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue
index 4711ac5..5e81e2e 100644
--- a/src/components/SideMenu.vue
+++ b/src/components/SideMenu.vue
@@ -4,6 +4,9 @@
       <img class="natlab-logo col-md-12" id="natlab-logo" src="../assets/natlab-logo.png" alt="NatLab Logo">
     <br>
     <div>
+      <li :class="[currentPage.includes('students') ? activeClass: '', 'navButton']">
+        <router-link style="margin-bottom: -25px;" to="/students" class="navA">Studentenübersicht</router-link><br>
+      </li>
       <li style="margin-top: 50px;" :class="[currentPage.includes('courses') ? activeClass: '', 'navButton']">
         <router-link style="margin-bottom: -25px;" to="/courses" class="navA">Kursübersicht</router-link><br>
       </li>
diff --git a/src/components/Student.vue b/src/components/Student.vue
new file mode 100644
index 0000000..d3fc5d2
--- /dev/null
+++ b/src/components/Student.vue
@@ -0,0 +1,361 @@
+<template>
+  <div class="card">
+    <div class="content col-md-12">
+      <div id="search_box" class="search_box col-md-4">
+        <div class="entry_box-inner">
+          {{checkedBoxes}}
+          <a id="editbutton" class="button" href="./editstudent" style="visibility: hidden">Eintrag bearbeiten</a>
+          <a id="addbutton" class="button" href="./createstudent">neuen Eintrag hinzufügen</a>
+          <a id="deletebutton" class="button" @click="deleterows">ausgewählte Einträge löschen</a>
+          <a id="exportbutton" class="button" @click="exportExcel">Tabelle exportieren</a>
+        </div>
+        <div class="search_box-inner">
+          <i><img src="../assets/search.svg"></i>
+          <input id="inpt_search" v-model="filter" type="text" class="search__input" placeholder="Suchen..." />
+        </div>
+      </div>
+      <table id="Table">
+        <tr>
+          <th scope="row">
+            <div class="form-check">
+              <input name="checkbox" type="checkbox" class="form-check-input" id="checkbox_headerline" @click="checkAllBoxes">
+              <label class="form-check-label" for="checkbox_headerline"></label>
+            </div>
+          </th>
+          <th v-on:click="sortTable('imgsortanrede')"><img id="imgsortanrede" :src="require('../assets/'+sortImg)">Anrede</th>
+          <th v-on:click="sortTable('imgsortfirstname')"><img id="imgsortcoursename" :src="require('../assets/'+sortImg)">Vorname</th>
+          <th v-on:click="sortTable('imgsortlastname')"><img id="imgsorteventtype" :src="require('../assets/'+sortImg)">Nachname</th>
+          <th v-on:click="sortTable('imgsortstreet')"><img id="imgsortcoursedate" :src="require('../assets/'+sortImg)">Straße</th>
+          <th v-on:click="sortTable('imgsortzip')"><img id="imgsorttopic" :src="require('../assets/'+sortImg)">Postleitzahl</th>
+          <th v-on:click="sortTable('imgsortcity')"><img id="imgsortcourselocation" :src="require('../assets/'+sortImg)">Ort</th>
+          <th v-on:click="sortTable('imgsortsommeruni_17')"><img id="imgsortsommeruni_17" :src="require('../assets/'+sortImg)">SommerUni 17</th>
+          <th v-on:click="sortTable('imgsortsommeruni_18')"><img id="imgsortsommeruni_18" :src="require('../assets/'+sortImg)">SommerUni 18</th>
+          <th v-on:click="sortTable('imgsortsommeruni_19')"><img id="imgsortsommeruni_19" :src="require('../assets/'+sortImg)">SommerUni 19</th>
+          <th v-on:click="sortTable('imgsortsommeruni_20')"><img id="imgsortsommeruni_20" :src="require('../assets/'+sortImg)">SommerUni 20</th>
+          <th v-on:click="sortTable('imgsortnatuerlich_20')"><img id="imgsortnatuerlich_20" :src="require('../assets/'+sortImg)">Natürlich 20</th>
+          <th v-on:click="sortTable('imgsortstatus')"><img id="imgsortstatus" :src="require('../assets/'+sortImg)">Status</th>
+        </tr>
+        <tr v-for="row in filteredRows" :key="row.id">
+          <td scope="row">
+            <div class="form-check">
+              <input type="checkbox" class="form-check-input" name="checkbox_tablerow" id="checkbox_tablerow" v-model="checkedBoxes" :value="row.id">
+              <label class="form-check-label" for="checkbox_tablerow"></label>
+            </div>
+          </td>
+          <td>{{row.anrede}}</td>
+          <td>{{row.firstname}}</td>
+          <td>{{row.lastname}}</td>
+          <td>{{row.street}}</td>
+          <td>{{row.zip}}</td>
+          <td>{{row.city}}</td>
+          <td>{{row.sommeruni17}}</td>
+          <td>{{row.sommeruni18}}</td>
+          <td>{{row.sommeruni19}}</td>
+          <td>{{row.sommeruni20}}</td>
+          <td>{{row.natuerlich20}}</td>
+          <td>{{row.status}}</td>
+        </tr>
+      </table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "Student",
+  data: function() {
+    return {
+      rows: [],
+      checkedBoxes: [],
+      rowIDs: ['imgsortanrede','imgsortfirstname','imgsortlastname','imgsortstreet','imgsortzip','imgsortcity','imgsortsommeruni_17','imgsortsommeruni_18','imgsortsommeruni_19','imgsortsommeruni_20','imgsortnatuerlich_20','imgsortstatus'],
+      filter:'',
+      currentSort:'imgsortlastname',
+      currentSortDir:'asc',
+      sortImg: 'sort_def.svg',
+    }
+  },
+
+  created() {
+    localStorage.setItem('checkedBoxID', 0);
+    this.loadData();
+  },
+
+  methods: {
+
+    deleterows(){
+      let x = 0;
+      for (x; x < this.checkedBoxes.length; x++){
+        this.$store.dispatch('student/delete', this.checkedBoxes[x]).then(
+            data => {
+              this.message = data.message;
+              this.successful = true;
+            },
+            error => {
+              this.message = (error.response && error.response.data) || error.message || error.toString();
+              this.successful = false;
+            }
+        );
+      }
+      this.rows = [];
+      this.loadData();
+    },
+
+    checkAllBoxes(){
+      var headercheckbox = document.getElementById('checkbox_headerline');
+      var headercheckboxvalue = headercheckbox.checked;
+
+      let checkboxes = document.getElementsByName('checkbox_tablerow');
+      this.checkedBoxes = [];
+      for(var i=0, n = checkboxes.length;i<n;i++) {
+        if (headercheckboxvalue){
+          this.checkedBoxes.push(this.rows[i].id);
+        }
+        checkboxes[i].checked = headercheckboxvalue;
+      }
+    },
+
+    async loadData(){
+      await this.$store.dispatch('student/getAll').then(
+          (data) => {
+            let x;
+            for(x = 0; x < data.length; x++){
+              this.rows.push({id: data[x].id, coursenumber: data[x].course_number, courseoffer: data[x].course_offer, coursename: data[x].course_name, eventtype: data[x].event_type, coursedate: data[x].course_datetime, topic: data[x].course_topic, courselocation: data[x].course_location, accompanyingteacher: data[x].accompanyingTeacher, supervisingstudents: data[x].supervisingStudents, presentstudents: data[x].presentStudents, registeredstudents: data[x].registeredStudents, instructor: data[x].instructor, notefield: data[x].noteField, anzahlung: data[x].anzahlung, honorar: data[x].honorar, status: data[x].status});
+            }
+          },
+          error => {
+            this.message = (error.response && error.response.data) || error.message || error.toString();
+            this.successful = false;
+          }
+      );
+    },
+
+    exportExcel(){
+      this.$store.dispatch('student/exportExcel', this.checkedBoxes);
+    },
+
+    "sortTable": function sortTable(col) {
+      this.currentSort = col;
+      if (this.currentSortDir === 'asc') {
+        this.currentSortDir = 'desc';
+
+        this.rowIDs.forEach(element =>{
+          console.log(this.currentSort);
+          if(this.currentSort === element){
+            document.getElementById(element).src = require('../assets/sort_asc.svg')
+          } else {
+            document.getElementById(element).src = require('../assets/sort_def.svg')
+          }
+        });
+
+        col = col.toString().replace("imgsort","");
+        this.rows.sort(function (a, b) {
+          if (typeof(a[col]) === 'number' && typeof(b[col]) === 'number'){
+            if (a[col] < b[col]) {
+              return 1;
+            } else if (a[col] > b[col]) {
+              return -1;
+            }
+          } else if (typeof(a[col]) === 'string' && typeof(b[col]) === 'string'){
+            if (a[col].toLowerCase() < b[col].toLowerCase()) {
+              return 1;
+            } else if (a[col].toLowerCase() > b[col].toLowerCase()) {
+              return -1;
+            }
+          }
+          return 0;
+        })
+      } else {
+        this.currentSortDir = 'asc';
+
+        this.rowIDs.forEach(element =>{
+          if(this.currentSort === element){
+            document.getElementById(element.toString()).src = require('../assets/sort_desc.svg');
+          } else {
+            document.getElementById(element.toString()).src = require('../assets/sort_def.svg');
+          }
+        });
+
+        col = col.toString().replace("imgsort","");
+        this.rows.sort(function (a, b) {
+          if (typeof(a[col]) === 'number' && typeof(b[col]) === 'number'){
+            if (a[col] > b[col]) {
+              return 1;
+            } else if (a[col]< b[col]) {
+              return -1;
+            }
+          } else if (a[col].toLowerCase() < b[col].toLowerCase()) {
+            if (a[col].toLowerCase() > b[col].toLowerCase()) {
+              return 1;
+            } else if (a[col].toLowerCase() < b[col].toLowerCase()) {
+              return -1;
+            }
+          }
+          return 0;
+        })
+      }
+    }
+  },
+
+  watch: {
+    checkedBoxes(){
+      if (this.checkedBoxes.length > 1 || this.checkedBoxes.length < 1){
+        document.getElementById("editbutton").style.visibility = "hidden";
+        // EXPORT & DELETE
+      } else {
+        document.getElementById("editbutton").style.visibility = "visible";
+      }
+      localStorage.setItem('checkedBoxID', this.checkedBoxes[0]);
+    }
+  },
+
+  computed: {
+    "columns": function columns() {
+      if (this.rows.length === 0) {
+        return [];
+      }
+      return Object.keys(this.rows[0])
+    },
+    filteredRows() {
+      return this.rows.filter(() => {
+        return true;
+        /*
+        const angebotsnummer = row.coursenumber.toLowerCase();
+        const angebot = row.courseoffer.toLowerCase();
+        const kursname = row.coursename.toLowerCase();
+        const veranstaltungsart = row.eventtype.toLowerCase();
+        const kursdatum = row.coursedate.toLowerCase();
+        const thema = row.topic.toLowerCase();
+        const kursort = row.courselocation.toLowerCase();
+        const begleitendeLehrkraft = row.accompanyingteacher.toLowerCase();
+        const betreuendeStudenten = row.supervisingstudents.toLowerCase();
+        const anzahlderAnwesenden = row.presentstudents.toString();
+        const anzahlderAngemeldeten = row.registeredstudents.toString();
+        const kursleiter = row.instructor.toLowerCase();
+        const anzahlung = row.anzahlung.toLowerCase();
+        const honorar = row.honorar.toLowerCase();
+        const status = row.status.toString().toLowerCase();
+        const notiz = row.notefield.toLowerCase();
+        const searchTerm = this.filter.toLowerCase();
+
+        return angebotsnummer.includes(searchTerm) || angebot.includes(searchTerm) || kursname.includes(searchTerm) || veranstaltungsart.includes(searchTerm) || kursdatum.includes(searchTerm) || thema.includes(searchTerm) || kursort.includes(searchTerm) || begleitendeLehrkraft.includes(searchTerm) || betreuendeStudenten.includes(searchTerm) || betreuendeStudenten.includes(searchTerm) || anzahlderAnwesenden.includes(searchTerm) || anzahlderAngemeldeten.includes(searchTerm) || kursleiter.includes(searchTerm) || notiz.includes(searchTerm) || anzahlung.includes(searchTerm) || honorar.includes(searchTerm) || status.includes(searchTerm);
+     */ });
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+.content{
+  background-color: transparent;
+  width: 100%;
+  height: 100vh;
+  overflow: auto;
+  white-space: nowrap;
+}
+
+.search_box{
+  width: 100%;
+  margin-top: 50px;
+  text-align:left;
+  position: relative;
+}
+
+.search_box-inner {
+  display:inline;
+  font-size:1em;
+  border-radius: 8em;
+  border:0.1em solid rgba(218, 208, 190, 1);
+  box-shadow:0 0 0.3em rgba(60, 60, 60, 0.4);
+  padding:0.3em;
+  background:white;
+}
+
+.entry_box-inner {
+  position: relative;
+  display:inline;
+}
+
+#exportbutton, #addbutton, #editbutton, #deletebutton {
+  margin-right: 25px;
+  display:inline-block;
+  padding:0.3em 1.2em;
+  border-radius:2em;
+  box-sizing: border-box;
+  text-decoration:none;
+  font-weight:300;
+  color:#FFFFFF;
+  background-color:#528fff;
+  text-align:center;
+  transition: all 0.2s;
+}
+
+#exportbutton:hover, #deletebutton:hover, #addbutton:hover , #editbutton:hover{
+  background-color:#9fc1ff;
+}
+
+.search_box-inner i img {
+  width: 5%;
+  text-align: center;
+  margin: 5px;
+}
+
+#inpt_search{
+  transition:all 0.2s ease-out;
+  width:15px;
+  border-radius:0;
+  box-shadow:none;
+  outline: none;
+  padding:0;
+  margin:0;
+  border:0;
+  background-color: transparent;
+  opacity:0;
+}
+#inpt_search:focus {
+  width: 10em;
+  opacity: 1;
+}
+
+.content table {
+  margin-top: 10px;
+  display: inline-block;
+  font-family: arial, sans-serif;
+  border-collapse: collapse;
+  width: 100%;
+}
+
+.content table th {
+  text-transform: uppercase;
+  text-align: left;
+  background: #9fc1ff;
+  color: #000000;
+  padding: 8px;
+  min-width: 30px;
+}
+
+.content table td {
+  text-align: left;
+  padding: 8px;
+  border-right: 2px solid #9fc1ff;
+}
+.content table td:last-child {
+  border-right: none;
+}
+
+.content table tbody tr:nth-child(2n) td {
+  background: #8f0c4f;
+}
+
+.card {
+  /* Add shadows to create the "card" effect */
+  box-shadow: 0 4px 30px 0 rgba(0,0,0,0.1);
+  transition: 0.2s;
+  margin-top: 20px;
+  margin-right: 10px;
+  height: 95vh;
+  border-radius: 20px;
+  border-color: transparent;
+}
+
+</style>
\ No newline at end of file
diff --git a/src/models/student.js b/src/models/student.js
new file mode 100644
index 0000000..adacc01
--- /dev/null
+++ b/src/models/student.js
@@ -0,0 +1,19 @@
+export default class Student {
+
+    constructor(id, anrede, firstname, lastname, street, zip, ctiy, sommeruni17, sommeruni18, sommeruni19, sommeruni20, natuerlich20, status) {
+        this.id = id;
+        this.anrede = anrede;
+        this.firstname = firstname;
+        this.lastname = lastname;
+        this.street = street;
+        this.zip = zip;
+        this.city = city;
+        this.sommeruni17 = sommeruni17;
+        this.sommeruni18 = sommeruni18;
+        this.sommeruni19 = sommeruni19;
+        this.sommeruni20 = sommeruni20;
+        this.natuerlich20 = natuerlich20;
+        this.status = status;
+
+    }
+}
diff --git a/src/router.js b/src/router.js
index 5f70384..6490528 100644
--- a/src/router.js
+++ b/src/router.js
@@ -16,6 +16,7 @@ import EditTeacher from "@/components/CreateEditComponents/EditTeacher";
 import Certifications from "@/components/Certifications";
 import CreateCertification from "@/components/CreateEditComponents/CreateCertification";
 import EditCertificate from "@/components/CreateEditComponents/EditCertificate";
+import Student from "@/components/Student";
 
 Vue.use(Router)
 
@@ -85,6 +86,11 @@ const router = new Router({
             path: '/home',
             component: Home
         },
+        {
+            path: '/students',
+            name: 'students',
+            component: Student,
+        },
         {
             path: '/courses',
             name: 'courses',
diff --git a/src/services/student.service.js b/src/services/student.service.js
new file mode 100644
index 0000000..b837279
--- /dev/null
+++ b/src/services/student.service.js
@@ -0,0 +1,111 @@
+import axios from 'axios';
+import authHeader from "@/services/auth-header";
+import fileDownload from 'js-file-download';
+
+const API_URL = 'http://localhost:9192/';
+
+class StudentService {
+
+    insert(student) {
+        return axios
+            .post(API_URL + 'insertStudent', {
+                    id: student.id,
+                    anrede: student.anrede,
+                    firstname: student.firstname,
+                    lastname: student.lastname,
+                    street: student.street,
+                    postcode: student.zip,
+                    ort: student.city,
+                    sommeruni_17: student.sommeruni17,
+                    sommeruni_18: student.sommeruni18,
+                    sommeruni_19: student.sommeruni19,
+                    sommeruni_20: student.sommeruni20,
+                    natuerlich_2020: student.natuerlich20,
+                }
+
+                ,{headers: authHeader() })
+            .then(response => {
+                return response.data;
+            });
+    }
+
+    update(student) {
+        return axios
+            .post(API_URL + 'updateStudent', {
+                    id: student.id,
+                    anrede: student.anrede,
+                    firstname: student.firstname,
+                    lastname: student.lastname,
+                    street: student.street,
+                    postcode: student.zip,
+                    ort: student.city,
+                    sommeruni_17: student.sommeruni17,
+                    sommeruni_18: student.sommeruni18,
+                    sommeruni_19: student.sommeruni19,
+                    sommeruni_20: student.sommeruni20,
+                    natuerlich_2020: student.natuerlich20,
+                }
+                ,{headers: authHeader() })
+            .then(response => {
+                return response.data;
+            });
+    }
+
+    delete(id) {
+        return axios
+            .post(API_URL + 'deleteStudent', {
+                    id: id
+                }
+                ,{headers: authHeader() })
+            .then(response => {
+                return response.data;
+            });
+    }
+
+    getAll() {
+        return axios
+            .get(API_URL + 'getStudent', {
+                headers: authHeader()
+            })
+            .then(response => {
+                return response.data;
+            });
+    }
+
+    getByID(idValue) {
+        return axios
+            .get(API_URL + 'getStudentsByID/'+idValue, {
+                headers: authHeader()
+            })
+            .then(response => {
+                return response.data;
+            });
+    }
+
+    exportExcel(ids) {
+        let idsArray = ""
+        if (ids.length > 0)
+            idsArray =  "/";
+
+        for (let i = 0; i < ids.length; i++) {
+            if (i === ids.length-1)
+                idsArray += ids[i];
+            else
+                idsArray += ids[i]+",";
+        }
+
+        return axios
+            .get(API_URL + 'exportStudentExcel' + idsArray, {
+                headers: authHeader(),
+                responseType: 'blob',
+            })
+            .then(response => {
+                fileDownload(response.data, "Student.xlsx");
+                return response.data;
+            });
+    }
+
+}
+
+
+export default new StudentService();
\ No newline at end of file
diff --git a/src/store/student.module.js b/src/store/student.module.js
new file mode 100644
index 0000000..edd8d4b
--- /dev/null
+++ b/src/store/student.module.js
@@ -0,0 +1,98 @@
+import StudentService from '../services/student.service';
+
+const initialState = null;
+
+export const student = {
+
+    namespaced: true,
+    state: initialState,
+    actions: {
+
+        insert({ commit }, student) {
+            return StudentService.insert(student).then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        },
+
+        update({ commit }, student) {
+            return StudentService.update(student).then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        },
+
+        delete({ commit }, id) {
+            return StudentService.delete(id).then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        },
+
+        getAll({ commit }) {
+            return StudentService.getAll().then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        },
+
+        getByID({ commit }, id) {
+            return StudentService.getByID(id).then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        },
+
+        exportExcel({ commit },ids) {
+            return StudentService.exportExcel(ids).then(
+                response => {
+                    commit('insertSuccess', response);
+                    return Promise.resolve(response);
+                },
+                error => {
+                    commit('insertFailure');
+                    return Promise.reject(error);
+                }
+            );
+        }
+    },
+
+    mutations: {
+        insertSuccess(state, response) {
+            state.response = response;
+        },
+        insertFailure(state, response) {
+            state.response = response;
+        }
+    }
+};
\ No newline at end of file
diff --git a/src/store/teacher.module.js b/src/store/teacher.module.js
index fea7f1d..24d890a 100644
--- a/src/store/teacher.module.js
+++ b/src/store/teacher.module.js
@@ -1,5 +1,4 @@
 import TeacherService from '../services/teacher.service';
-import CourseService from "@/services/course.service";
 
 const initialState = null;
 
-- 
GitLab