Fixed pic upload page relation

This commit is contained in:
Torsten Schulz
2024-07-12 12:06:20 +02:00
parent 0f19465709
commit 2719bd3a3b
3 changed files with 161 additions and 132 deletions

View File

@@ -1,4 +1,4 @@
const { Image } = require('../models'); const { Image, MenuItem, Page } = require('../models');
const { v4: uuidv4 } = require('uuid'); const { v4: uuidv4 } = require('uuid');
const multer = require('multer'); const multer = require('multer');
const path = require('path'); const path = require('path');
@@ -17,17 +17,33 @@ const upload = multer({ storage });
exports.uploadImage = upload.single('image'); exports.uploadImage = upload.single('image');
exports.getAllPages = async (req, res) => {
try {
const pages = await MenuItem.findAll();
res.status(200).json(pages.map((item) => {return { link: item.link, name: item.name}; }));
} catch (error) {
console.log(error);
res.status(500).send('Fehler beim Auslesen');
}
}
exports.saveImageDetails = async (req, res) => { exports.saveImageDetails = async (req, res) => {
try { try {
const { title, description, pageId } = req.body; const { title, description, page } = req.body;
const filename = req.file.filename; const filename = req.file.filename;
const pageItem = await Page.findAll({ where: { link: page } });
console.log(pageItem)
const newImage = await Image.create({ const newImage = await Image.create({
id: uuidv4(), id: uuidv4(),
filename, filename,
title, title,
description, description,
pageId: pageId || null pageId: pageItem && pageItem[0] ? pageItem[0].id : null
}); });
if (page) {
const imageUrl = `/uploads/${filename}`;
await MenuItem.update({ image: imageUrl }, { where: { link: page} });
}
res.status(201).json(newImage); res.status(201).json(newImage);
} catch (error) { } catch (error) {
console.error('Fehler beim Speichern des Bildes:', error); console.error('Fehler beim Speichern des Bildes:', error);
@@ -37,7 +53,7 @@ exports.saveImageDetails = async (req, res) => {
exports.getImages = async (req, res) => { exports.getImages = async (req, res) => {
try { try {
const images = await Image.findAll({ order: [['title', 'ASC']]}); const images = await Image.findAll({ order: [['title', 'ASC']] });
res.status(200).json(images); res.status(200).json(images);
} catch (error) { } catch (error) {
console.error('Fehler beim Abrufen der Bilder:', error); console.error('Fehler beim Abrufen der Bilder:', error);

View File

@@ -1,12 +1,14 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const { uploadImage, saveImageDetails, getImages, getImagesByPage, getImageById, getImageByHash, updateImage } = require('../controllers/imageController'); const { getAllPages, uploadImage, saveImageDetails, getImages, getImagesByPage, getImageById, getImageByHash, updateImage } = require('../controllers/imageController');
const authMiddleware = require('../middleware/authMiddleware') const authMiddleware = require('../middleware/authMiddleware')
router.post('/', authMiddleware, uploadImage, saveImageDetails); router.post('/', authMiddleware, uploadImage, saveImageDetails);
router.get('/', authMiddleware, getImages); router.get('/', authMiddleware, getImages);
router.get('/page/:pageId', getImagesByPage); router.get('/page/:pageId', getImagesByPage);
router.put('/hash/:id', getImageByHash);
router.get('/pages', getAllPages);
router.get('/:id', getImageById); router.get('/:id', getImageById);
router.put('/:id', authMiddleware, updateImage); router.put('/:id', authMiddleware, updateImage);
router.put('/hash/:id', getImageByHash);
module.exports = router; module.exports = router;

View File

@@ -18,7 +18,7 @@
<label for="page">Seite</label> <label for="page">Seite</label>
<select id="page" v-model="selectedPage"> <select id="page" v-model="selectedPage">
<option value="">Keine Seite</option> <option value="">Keine Seite</option>
<option v-for="page in pages" :key="page.id" :value="page.id">{{ page.title }}</option> <option v-for="page in pages" :key="page.value" :value="page.value">{{ page.caption }}</option>
</select> </select>
</div> </div>
<button type="submit">Hochladen</button> <button type="submit">Hochladen</button>
@@ -34,13 +34,13 @@
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import axios from '../../axios'; import axios from '../../axios';
import { formatDate, formatTimeFromDate } from '@/utils/strings' import { formatDate, formatTimeFromDate } from '@/utils/strings'
export default { export default {
name: 'ImageUpload', name: 'ImageUpload',
data() { data() {
return { return {
@@ -63,7 +63,7 @@
formData.append('title', this.title); formData.append('title', this.title);
formData.append('description', this.description); formData.append('description', this.description);
formData.append('image', this.image); formData.append('image', this.image);
formData.append('pageId', this.selectedPage); formData.append('page', this.selectedPage);
try { try {
await axios.post('/image/', formData); await axios.post('/image/', formData);
@@ -83,8 +83,18 @@
}, },
async fetchPages() { async fetchPages() {
try { try {
const response = await axios.get('/image/pages'); const response = await axios.get('/menu-data');
this.pages = response.data; const buildRecursive = function (data, prefix = '') {
return data.flatMap(item => {
let children = [];
if (item.submenu && item.submenu.length) {
children = buildRecursive(item.submenu, prefix + item.name + " -> ");
}
return [{ value: item.link, caption: prefix + item.name }, ...children];
});
};
this.pages = buildRecursive(response.data);
} catch (error) { } catch (error) {
console.error('Fehler beim Abrufen der Seiten:', error); console.error('Fehler beim Abrufen der Seiten:', error);
} }
@@ -112,23 +122,24 @@
this.fetchImages(); this.fetchImages();
this.fetchPages(); this.fetchPages();
} }
}; };
</script> </script>
<style scoped> <style scoped>
form div { form div {
margin-bottom: 10px; margin-bottom: 10px;
} }
.uploaded-image {
.uploaded-image {
display: inline-block; display: inline-block;
margin: 0 0 0.5em 0.5em; margin: 0 0 0.5em 0.5em;
border: 1px solid #e0e0e0; border: 1px solid #e0e0e0;
padding: 10px; padding: 10px;
} }
.uploaded-image input,
.uploaded-image textarea { .uploaded-image input,
.uploaded-image textarea {
width: 100%; width: 100%;
margin: 5px 0; margin: 5px 0;
} }
</style> </style>