优化验证报名信息对话框车牌号输入布局,使标签和输入框在同一行显示
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { Activity, Photo, Sponsor, Expense, Registration } = require('../models');
|
||||
const { upload, uploadFilesToMinio } = require('../middleware/upload');
|
||||
const { Activity, Photo, Sponsor, Expense, Registration, Prize } = require('../models');
|
||||
const { upload, getFileUrls } = require('../middleware/upload');
|
||||
|
||||
// 获取活动列表
|
||||
router.get('/activities', async (req, res) => {
|
||||
@@ -23,10 +23,17 @@ router.get('/activities/:id', async (req, res) => {
|
||||
const photos = await Photo.findAll({
|
||||
where: { activityId: req.params.id, status: 'approved' }
|
||||
});
|
||||
const sponsors = await Sponsor.findAll({ where: { activityId: req.params.id } });
|
||||
const sponsors = await Sponsor.findAll({
|
||||
where: { activityId: req.params.id },
|
||||
order: [['sortOrder', 'ASC'], ['id', 'ASC']]
|
||||
});
|
||||
const expenses = await Expense.findAll({ where: { activityId: req.params.id } });
|
||||
const prizes = await Prize.findAll({
|
||||
where: { activityId: req.params.id },
|
||||
order: [['sortOrder', 'ASC'], ['id', 'ASC']]
|
||||
});
|
||||
|
||||
res.json({ activity, photos, sponsors, expenses });
|
||||
res.json({ activity, photos, sponsors, expenses, prizes });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
@@ -46,7 +53,7 @@ router.get('/activities/:id/expenses', async (req, res) => {
|
||||
router.post('/activities/:id/photos', upload.array('photos', 10), async (req, res) => {
|
||||
try {
|
||||
const { uploadedBy } = req.body;
|
||||
const uploaded = await uploadFilesToMinio(req.files);
|
||||
const uploaded = getFileUrls(req.files);
|
||||
const photos = uploaded.map(file => ({
|
||||
activityId: req.params.id,
|
||||
url: file.url,
|
||||
|
||||
+81
-15
@@ -3,9 +3,10 @@ const router = express.Router();
|
||||
const bcrypt = require('bcryptjs');
|
||||
const jwt = require('jsonwebtoken');
|
||||
const auth = require('../middleware/auth');
|
||||
const { upload, uploadFilesToMinio } = require('../middleware/upload');
|
||||
const { deleteFile } = require('../utils/minio');
|
||||
const { Admin, Activity, Registration, Expense, Photo, Sponsor } = require('../models');
|
||||
const { upload, getFileUrls } = require('../middleware/upload');
|
||||
const { Admin, Activity, Registration, Expense, Photo, Sponsor, Prize } = require('../models');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// 管理员登录
|
||||
router.post('/login', async (req, res) => {
|
||||
@@ -100,7 +101,7 @@ router.post('/expenses', auth, upload.array('media', 5), async (req, res) => {
|
||||
let media = [];
|
||||
|
||||
if (req.files && req.files.length > 0) {
|
||||
const uploaded = await uploadFilesToMinio(req.files);
|
||||
const uploaded = getFileUrls(req.files);
|
||||
media = uploaded.map(file => ({
|
||||
url: file.url,
|
||||
type: file.mimetype.startsWith('video/') ? 'video' : 'image'
|
||||
@@ -152,7 +153,7 @@ router.put('/expenses/:id', auth, upload.array('media', 5), async (req, res) =>
|
||||
|
||||
// 处理新上传的媒体
|
||||
if (req.files && req.files.length > 0) {
|
||||
const uploaded = await uploadFilesToMinio(req.files);
|
||||
const uploaded = getFileUrls(req.files);
|
||||
const newMedia = uploaded.map(file => ({
|
||||
url: file.url,
|
||||
type: file.mimetype.startsWith('video/') ? 'video' : 'image'
|
||||
@@ -184,7 +185,7 @@ router.delete('/expenses/:id', auth, async (req, res) => {
|
||||
router.post('/photos', auth, upload.array('photos', 10), async (req, res) => {
|
||||
try {
|
||||
const { activityId } = req.body;
|
||||
const uploaded = await uploadFilesToMinio(req.files);
|
||||
const uploaded = getFileUrls(req.files);
|
||||
const photos = uploaded.map(file => ({
|
||||
activityId,
|
||||
url: file.url,
|
||||
@@ -231,11 +232,12 @@ router.delete('/photos/:id', auth, async (req, res) => {
|
||||
return res.status(404).json({ error: '照片不存在' });
|
||||
}
|
||||
|
||||
// 从URL提取文件名
|
||||
// 删除本地文件
|
||||
const filename = photo.url.split('/').pop();
|
||||
|
||||
// 从MinIO删除文件
|
||||
await deleteFile(filename);
|
||||
const filePath = path.join(__dirname, '../uploads', filename);
|
||||
if (fs.existsSync(filePath)) {
|
||||
fs.unlinkSync(filePath);
|
||||
}
|
||||
|
||||
// 从数据库删除记录
|
||||
await photo.destroy();
|
||||
@@ -249,13 +251,20 @@ router.delete('/photos/:id', auth, async (req, res) => {
|
||||
// 添加赞助商
|
||||
router.post('/sponsors', auth, upload.single('logo'), async (req, res) => {
|
||||
try {
|
||||
const { activityId, name, type, link } = req.body;
|
||||
const { activityId, name, type, link, sortOrder } = req.body;
|
||||
let logo = null;
|
||||
if (req.file) {
|
||||
const [uploaded] = await uploadFilesToMinio(req.file);
|
||||
const [uploaded] = getFileUrls(req.file);
|
||||
logo = uploaded.url;
|
||||
}
|
||||
const sponsor = await Sponsor.create({ activityId, name, logo, type, link });
|
||||
const sponsor = await Sponsor.create({
|
||||
activityId,
|
||||
name,
|
||||
logo,
|
||||
type,
|
||||
link,
|
||||
sortOrder: sortOrder || 0
|
||||
});
|
||||
res.json(sponsor);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
@@ -265,11 +274,15 @@ router.post('/sponsors', auth, upload.single('logo'), async (req, res) => {
|
||||
// 更新赞助商
|
||||
router.put('/sponsors/:id', auth, upload.single('logo'), async (req, res) => {
|
||||
try {
|
||||
const { name, type, link } = req.body;
|
||||
const { name, type, link, sortOrder } = req.body;
|
||||
const updateData = { name, type, link };
|
||||
|
||||
if (sortOrder !== undefined) {
|
||||
updateData.sortOrder = sortOrder;
|
||||
}
|
||||
|
||||
if (req.file) {
|
||||
const [uploaded] = await uploadFilesToMinio(req.file);
|
||||
const [uploaded] = getFileUrls(req.file);
|
||||
updateData.logo = uploaded.url;
|
||||
}
|
||||
|
||||
@@ -291,4 +304,57 @@ router.delete('/sponsors/:id', auth, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// 添加奖品
|
||||
router.post('/prizes', auth, upload.single('image'), async (req, res) => {
|
||||
try {
|
||||
const { activityId, name, level, description, quantity, sortOrder } = req.body;
|
||||
let image = null;
|
||||
if (req.file) {
|
||||
const [uploaded] = getFileUrls([req.file]);
|
||||
image = uploaded.url;
|
||||
}
|
||||
const prize = await Prize.create({
|
||||
activityId,
|
||||
name,
|
||||
level,
|
||||
description,
|
||||
image,
|
||||
quantity: quantity || 1,
|
||||
sortOrder: sortOrder || 0
|
||||
});
|
||||
res.json(prize);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// 更新奖品
|
||||
router.put('/prizes/:id', auth, upload.single('image'), async (req, res) => {
|
||||
try {
|
||||
const { name, level, description, quantity, sortOrder } = req.body;
|
||||
const updateData = { name, level, description, quantity, sortOrder };
|
||||
|
||||
if (req.file) {
|
||||
const [uploaded] = getFileUrls([req.file]);
|
||||
updateData.image = uploaded.url;
|
||||
}
|
||||
|
||||
await Prize.update(updateData, { where: { id: req.params.id } });
|
||||
const prize = await Prize.findByPk(req.params.id);
|
||||
res.json(prize);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// 删除奖品
|
||||
router.delete('/prizes/:id', auth, async (req, res) => {
|
||||
try {
|
||||
await Prize.destroy({ where: { id: req.params.id } });
|
||||
res.json({ message: '删除成功' });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user