Files
yu-zhi-ran/platform/frontend/sw.js
T
Yuzhiran Dev 233e23016c feat: 内容数据迁移至数据库,合规审查全链路打通
- 文章 HTML 存储从文件系统迁移至 articles 表,删除 releases 目录
- 合规审查从 DB 读取 HTML,审查结果写回 DB,通过后自动推进至待发布
- 新增 todayCount 筛选按钮,与系统概览统计数据一致
- 全屏预览修复:提升 z-index 超过侧边栏,添加退出全屏/关闭按钮
- 统一 '优化' → '审查' 命名,消除前后端术语不一致
- 调度器创作完成后自动触发审查(生成 → 审查 → 待发布)
- 清理旧备份/调试文件、过期大纲和研究笔记
2026-05-13 17:33:56 +08:00

117 lines
3.2 KiB
JavaScript

// Service Worker for 宇之然内容创作平台
const CACHE_NAME = 'yuzhiran-v2';
const CACHE_URLS = [
'/',
'/index.html',
'/offline.html',
'/static/vue.global.prod.js',
'/static/element-plus.css',
'/static/element-plus.full.js',
'/manifest.json'
];
// 安装事件:预缓存核心资源
self.addEventListener('install', (event) => {
console.log('[SW] Installing...');
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
console.log('[SW] Pre-caching core assets');
return cache.addAll(CACHE_URLS.map(url => {
// 忽略同源请求404错误(静态资源可能不存在)
return new Promise((resolve, reject) => {
fetch(url).then(response => {
if (response.ok) {
resolve(url);
} else {
reject(new Error(`Failed to fetch ${url}: ${response.status}`));
}
}).catch(() => {
// 静默失败,不阻止安装
resolve(url);
});
});
}));
}).catch(err => {
console.error('[SW] Install failed:', err);
})
);
self.skipWaiting();
});
// 激活事件:清理旧缓存
self.addEventListener('activate', (event) => {
console.log('[SW] Activating...');
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cache) => {
if (cache !== CACHE_NAME) {
console.log('[SW] Deleting old cache:', cache);
return caches.delete(cache);
}
})
);
})
);
self.clients.claim();
});
// 网络请求拦截:Cache First + Network Fallback
self.addEventListener('fetch', (event) => {
const { request } = event;
const url = new URL(request.url);
// 只处理同源请求
if (url.origin !== location.origin) {
return;
}
// API 请求:Network Only(不走缓存)
if (url.pathname.startsWith('/api/')) {
event.respondWith(fetch(request));
return;
}
// 静态资源:Cache First
event.respondWith(
caches.match(request).then((cached) => {
if (cached) {
// 返回缓存,并在后台更新
fetch(request).then(response => {
if (response.ok) {
caches.open(CACHE_NAME).then(cache => cache.put(request, response));
}
});
return cached;
}
// 无缓存,发起网络请求
return fetch(request).then(response => {
// 成功且为有效响应,加入缓存
if (response.ok && response.status === 200) {
const responseClone = response.clone();
caches.open(CACHE_NAME).then(cache => cache.put(request, responseClone));
}
return response;
}).catch(() => {
// 网络失败,尝试返回离线页面(如果是文档请求)
if (request.destination === 'document') {
return caches.match('/offline.html');
}
});
})
);
});
// 后台同步(可选:在网络恢复后发送错误日志)
self.addEventListener('sync', (event) => {
if (event.tag === 'sync-logs') {
event.waitUntil(syncLogs());
}
});
async function syncLogs() {
// TODO: 实现日志同步
console.log('[SW] Syncing logs...');
}