feat: MC Report System - MySQL + Express + Vanilla JS SPA

This commit is contained in:
2026-07-12 01:23:19 +08:00
commit 247a4e851d
52 changed files with 5710 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
const express = require('express');
const { query, getRow } = require('../db');
const { authenticate, requireRole } = require('../middleware/auth');
const router = express.Router();
router.get('/email-templates', authenticate, requireRole('owner','admin'), async (req, res) => {
res.json(await query('SELECT * FROM email_templates ORDER BY id'));
});
router.get('/email-templates/:code', authenticate, requireRole('owner','admin'), async (req, res) => {
const t = await getRow('SELECT * FROM email_templates WHERE code = ?', [req.params.code]);
if (!t) return res.status(404).json({ error: '模板不存在' });
res.json(t);
});
router.put('/email-templates/:code', authenticate, requireRole('owner','admin'), async (req, res) => {
const { subject, body } = req.body;
if (!subject||!body) return res.status(400).json({ error: '标题和内容不能为空' });
const t = await getRow('SELECT * FROM email_templates WHERE code = ?', [req.params.code]);
if (!t) return res.status(404).json({ error: '模板不存在' });
await query('UPDATE email_templates SET subject = ?, body = ? WHERE code = ?', [subject, body, req.params.code]);
await query("INSERT INTO audit_logs(user_id, username, action, entity_type, entity_id, details) VALUES (?,?,?,?,?,?)", [req.user.id, req.user.username, 'update_email_template', 'email_template', t.id, `更新模板: ${t.name}`]);
res.json({ message: '模板更新成功' });
});
router.get('/settings', authenticate, requireRole('owner','admin'), async (req, res) => {
const rows = await query('SELECT k, v, label FROM settings ORDER BY k');
const map = {};
for (const r of rows) map[r.k] = { value: r.v, label: r.label };
res.json(map);
});
router.put('/settings', authenticate, requireRole('owner','admin'), async (req, res) => {
const updates = req.body;
if (!updates||typeof updates!=='object') return res.status(400).json({ error: '无效数据' });
for (const [key, val] of Object.entries(updates)) {
const v = typeof val === 'object' ? val.value : String(val);
const l = typeof val === 'object' ? val.label : null;
await query("INSERT INTO settings(k, v, label) VALUES (?,?,?) ON DUPLICATE KEY UPDATE v = VALUES(v)", [key, v, l]);
}
await query("INSERT INTO audit_logs(user_id, username, action, entity_type, entity_id, details) VALUES (?,?,?,?,?,?)", [req.user.id, req.user.username, 'update_settings', 'settings', 0, '更新系统设置']);
res.json({ message: '设置已保存' });
});
module.exports = router;