修改缓存

This commit is contained in:
dcr_xuxgc
2026-06-12 18:55:06 +08:00
parent d759a9e740
commit 449b1417ec
5 changed files with 134 additions and 3 deletions

View File

@@ -200,8 +200,33 @@ function parseJSON(str, defaultValue) {
}
}
// 刷新缓存 - 从数据库重新加载所有数据
async function refreshCache() {
if (!pool) return false;
try {
const [posts] = await pool.execute('SELECT * FROM posts ORDER BY date DESC');
const [settings] = await pool.execute('SELECT * FROM settings WHERE id = 1');
const [about] = await pool.execute('SELECT * FROM about WHERE id = 1');
memoryStore.posts = posts;
if (settings.length > 0) {
memoryStore.settings = formatSettings(settings[0]);
}
if (about.length > 0) {
memoryStore.about = formatAbout(about[0]);
}
console.log('✅ 缓存已刷新');
return true;
} catch (error) {
console.error('缓存刷新失败:', error.message);
return false;
}
}
function getPool() {
return pool;
}
module.exports = { initDatabase, getPool };
module.exports = { initDatabase, getPool, refreshCache };

View File

@@ -18,12 +18,14 @@ const aboutRouter = require('./routes/about');
const settingsRouter = require('./routes/settings');
const cronRouter = require('./routes/cron');
const configRouter = require('./routes/config');
const cacheRouter = require('./routes/cache');
app.use('/api/posts', postsRouter);
app.use('/api/about', aboutRouter);
app.use('/api/settings', settingsRouter);
app.use('/api/cron-tasks', cronRouter);
app.use('/api/config', configRouter);
app.use('/api/cache', cacheRouter);
// 健康检查
app.get('/api/health', (req, res) => {

View File

@@ -0,0 +1,20 @@
const express = require('express');
const router = express.Router();
const { refreshCache } = require('../config/database');
// 刷新所有缓存posts, settings, about
router.post('/refresh', async (req, res) => {
try {
const success = await refreshCache();
if (success) {
res.json({ message: '缓存已刷新', success: true });
} else {
res.status(500).json({ error: '缓存刷新失败', success: false });
}
} catch (error) {
console.error('缓存刷新失败:', error);
res.status(500).json({ error: '缓存刷新失败', success: false });
}
});
module.exports = router;

View File

@@ -48,7 +48,12 @@ export const messages = {
uploadIcon: '上传图标',
defaultIcon: '恢复默认',
myIcons: '我的图标库',
myImages: '我的图片库'
myImages: '我的图片库',
dataCache: '数据缓存',
refreshCache: '刷新缓存',
refreshCacheDesc: '直接从数据库重新加载数据,清除内存缓存',
refreshSuccess: '缓存已刷新',
refreshFailed: '刷新失败'
},
serverConfig: {
title: '服务端配置',
@@ -177,7 +182,12 @@ export const messages = {
uploadIcon: 'Upload Icon',
defaultIcon: 'Reset Default',
myIcons: 'My Icons',
myImages: 'My Images'
myImages: 'My Images',
dataCache: 'Data Cache',
refreshCache: 'Refresh Cache',
refreshCacheDesc: 'Reload data directly from database, clear memory cache',
refreshSuccess: 'Cache refreshed',
refreshFailed: 'Refresh failed'
},
serverConfig: {
title: 'Server Config',

View File

@@ -23,6 +23,8 @@ const bgImagePresets = [
]
const isUploading = ref(false)
const isRefreshing = ref(false)
const refreshMessage = ref('')
function onBgTypeChange(value) {
settings.setBgType(value)
@@ -205,6 +207,24 @@ function deleteUploadedIcon(id) {
function resetFavicon() {
settings.setFavicon('')
}
async function refreshCache() {
isRefreshing.value = true
refreshMessage.value = ''
try {
const res = await fetch('/api/cache/refresh', { method: 'POST' })
const data = await res.json()
if (data.success) {
refreshMessage.value = t('settings.refreshSuccess')
} else {
refreshMessage.value = t('settings.refreshFailed')
}
setTimeout(() => { refreshMessage.value = '' }, 3000)
} catch (e) {
refreshMessage.value = t('settings.refreshFailed')
}
isRefreshing.value = false
}
</script>
<template>
@@ -410,6 +430,24 @@ function resetFavicon() {
></div>
</div>
</div>
<div class="settings-section">
<h2>{{ t('settings.dataCache') }}</h2>
<div class="setting-item">
<label>{{ t('settings.refreshCache') }}</label>
<p class="cache-desc">{{ t('settings.refreshCacheDesc') }}</p>
<div class="cache-actions">
<button
class="btn-refresh"
@click="refreshCache"
:disabled="isRefreshing"
>
{{ isRefreshing ? t('settings.uploading') : t('settings.refreshCache') }}
</button>
<span v-if="refreshMessage" class="refresh-message">{{ refreshMessage }}</span>
</div>
</div>
</div>
</div>
</template>
@@ -768,4 +806,40 @@ function resetFavicon() {
.btn-reset:hover {
background: #ccc;
}
.cache-desc {
font-size: 0.85rem;
color: var(--color-text-secondary);
margin-bottom: 0.75rem;
}
.cache-actions {
display: flex;
align-items: center;
gap: 1rem;
}
.btn-refresh {
background: var(--color-primary);
color: white;
padding: 0.5rem 1rem;
border-radius: 4px;
border: none;
cursor: pointer;
font-size: 0.9rem;
}
.btn-refresh:hover {
opacity: 0.9;
}
.btn-refresh:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.refresh-message {
font-size: 0.85rem;
color: var(--color-primary);
}
</style>