Added Datebase to attractions

This commit is contained in:
2025-05-07 15:24:49 +02:00
parent c3b05a671f
commit 5b6a46d81b
4 changed files with 45 additions and 12 deletions

View File

@@ -1,4 +1,5 @@
import express from 'express'; import express from 'express';
import cors from 'cors';
import pathRoutes from './routes/parkRoutes.js'; import pathRoutes from './routes/parkRoutes.js';
import coasterRoutes from './routes/coasterRoutes.js'; import coasterRoutes from './routes/coasterRoutes.js';
@@ -8,6 +9,8 @@ const port = 3000;
// Middleware für JSON-Anfragen // Middleware für JSON-Anfragen
app.use(express.json()); app.use(express.json());
app.use(cors());
// Routen hinzufügen // Routen hinzufügen
app.use('/api/parks', pathRoutes); app.use('/api/parks', pathRoutes);
app.use('/api/coasters', coasterRoutes); app.use('/api/coasters', coasterRoutes);

14
package-lock.json generated
View File

@@ -8,6 +8,7 @@
"name": "coasterdb", "name": "coasterdb",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"cors": "^2.8.5",
"express": "^5.1.0", "express": "^5.1.0",
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"vue": "^3.5.13" "vue": "^3.5.13"
@@ -2179,6 +2180,18 @@
"node": ">=6.6.0" "node": ">=6.6.0"
} }
}, },
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/cosmiconfig": { "node_modules/cosmiconfig": {
"version": "7.1.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -4076,7 +4089,6 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }

View File

@@ -10,6 +10,7 @@
"api-backend": "cross-env TS_NODE_PROJECT=./api-backend/tsconfig.json node --loader ts-node/esm api-backend/src/index.ts" "api-backend": "cross-env TS_NODE_PROJECT=./api-backend/tsconfig.json node --loader ts-node/esm api-backend/src/index.ts"
}, },
"dependencies": { "dependencies": {
"cors": "^2.8.5",
"express": "^5.1.0", "express": "^5.1.0",
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"vue": "^3.5.13" "vue": "^3.5.13"

View File

@@ -9,12 +9,30 @@ export default {
}, },
data() { data() {
return { return {
coasters: [ coasters: [] as { id: number; name: string; location: string; average_visitor_count: number; ticket_price: string, park_id: number, park_name?: string }[]
{ name: 'Blue Fire', park: 'Europa Park' }, }
{ name: 'Taron', park: 'Phantasialand' }, },
{ name: 'Silver Star', park: 'Europa Park' }, async mounted() {
{ name: 'Karacho', park: 'Erlebnispark Tripsdrill' } try {
] const response = await fetch('http://localhost:3000/api/coasters');
if (response.ok) {
const data = await response.json();
this.coasters = await Promise.all(data.map(async (coaster: { [x: string]: any; id: number; name: string; location: string; average_visitor_count: number; ticket_price: string, park_id: number }) => {
// Hole den Parknamen anhand der park_id
const parkResponse = await fetch(`http://localhost:3000/api/parks/${coaster.park_id}`);
if (parkResponse.ok) {
const parkData = await parkResponse.json();
coaster.park_name = parkData.name; // Füge den Parknamen zum Coaster hinzu
} else {
console.error(`Fehler beim Laden des Parks mit ID ${coaster.park_id}`);
}
return coaster;
}));
} else {
console.error('Fehler beim Laden der Achterbahnen:', response.statusText);
}
} catch (error) {
console.error('Fehler beim Abrufen der Achterbahnen:', error);
} }
} }
} }
@@ -34,23 +52,22 @@ export default {
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-6"> <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-2 gap-6">
<a <a
v-for="coaster in coasters" v-for="coaster in coasters"
:key="coaster.name" :key="coaster.id"
:href="`/app/coaster/${coaster.name.replace(' ', '_')}`" :href="`/app/coaster/${coaster.id}`"
class="bg-white dark:bg-gray-800 shadow-md sm:rounded-lg p-6 hover:shadow-lg transition-shadow" class="bg-white dark:bg-gray-800 shadow-md sm:rounded-lg p-6 hover:shadow-lg transition-shadow"
> >
<h2 class="text-xl font-bold text-gray-900 dark:text-white mb-2"> <h2 class="text-xl font-bold text-gray-900 dark:text-white mb-2">
{{ coaster.name }} {{ coaster.name }}
</h2> </h2>
<p class="text-gray-700 dark:text-gray-300"> <p class="text-gray-700 dark:text-gray-300">
<span class="font-semibold">Park:</span> {{ coaster.park }} <span class="font-semibold">Park:</span> {{ coaster.park_name || 'Unbekannt' }}
</p> </p>
</a> </a>
</div> </div>
</div> </div>
</main> </main>
</div> </div>
</template> </template>
<style scoped> <style scoped>
</style> </style>