This commit is contained in:
Zyronon
2025-11-18 01:35:27 +08:00
parent 202d0f827d
commit 5fc0dbaa1d
3 changed files with 123 additions and 439 deletions

View File

@@ -326,122 +326,97 @@
</script>
<script>
// 旧域名
const OLD_ORIGIN = "https://2study.top";
// 旧域名地址
const OLD_ORIGIN = 'https://2study.top';
// 需要迁移的 IndexedDB store 名称
const IDB_STORE_NAMES = [
"type-words-app-version",
"typing-word-dict",
"typing-word-setting",
"typing-word-files",
// 需要迁移的 IndexedDB key
const IDB_KEYS = [
'type-words-app-version',
'typing-word-dict',
'typing-word-setting',
'typing-word-files'
];
// 需要迁移的 localStorage key
const LS_KEYS = [
"PracticeSaveWord",
"PracticeSaveArticle"
'PracticeSaveWord',
'PracticeSaveArticle'
];
let key = 'keyval-store'
// 打开或创建新的 IndexedDB
function openIndexedDB() {
return new Promise((resolve, reject) => {
const request = indexedDB.open(key, 1);
// 1⃣ 动态加载 idb-keyval
function loadIDBKeyval() {
return new Promise((resolve) => {
if (window.idbKeyval) return resolve(window.idbKeyval);
request.onupgradeneeded = (event) => {
const db = event.target.result;
IDB_STORE_NAMES.forEach((storeName) => {
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName);
const script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/idb-keyval@6.2.2/dist/umd.js';
script.onload = () => resolve(window.idbKeyval);
document.head.appendChild(script);
});
}
// 2⃣ 创建 iframe 并发送迁移请求
async function migrateFromOldSite() {
return new Promise(async (resolve, reject) => {
const db = await loadIDBKeyval();
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = `${OLD_ORIGIN}/migrate.html`;
// 安全接收旧域名返回的数据
function onMessage(event) {
if (event.data?.type !== 'MIGRATION_RESULT') return;
const payload = event.data.payload;
// 写入 localStorage
LS_KEYS.forEach(key => {
if (payload.localStorage[key] !== undefined) {
localStorage.setItem(key, payload.localStorage[key]);
}
});
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
// 写入数据到 IndexedDB
async function writeToIndexedDB(data) {
const db = await openIndexedDB();
return new Promise((resolve, reject) => {
const tx = db.transaction(IDB_STORE_NAMES, "readwrite");
for (const storeName of IDB_STORE_NAMES) {
const store = tx.objectStore(storeName);
const value = data.indexedDB[storeName];
if (value !== undefined) {
store.put(value, "value");
}
}
tx.oncomplete = () => resolve();
tx.onerror = () => reject(tx.error);
});
}
// 写入 LocalStorage
function writeToLocalStorage(data) {
for (const key of LS_KEYS) {
if (data.localStorage[key] !== undefined) {
localStorage.setItem(key, data.localStorage[key]);
}
}
}
// ---- 主逻辑 ----
async function migrateFromOldSite() {
return new Promise((resolve) => {
// 创建隐藏 iframe
const iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = `${OLD_ORIGIN}/migrate.html`;
document.body.appendChild(iframe);
// 接收旧域名的数据
window.addEventListener("message", async (event) => {
if (event.data.type !== "MIGRATE_RESULT") return;
const payload = event.data.payload;
// 写入 LocalStorage
writeToLocalStorage(payload);
// 写入 IndexedDB
await writeToIndexedDB(payload);
// 清理 iframe
iframe.remove();
(async () => {
for (let key of IDB_KEYS) {
if (payload.indexedDB[key] !== undefined) {
await db.set(key, payload.indexedDB[key]);
}
}
resolve(true);
});
// 清理
window.removeEventListener('message', onMessage);
iframe.remove();
resolve(true);
})();
}
iframe.onload = function () {
setTimeout(()=>{
iframe.contentWindow.postMessage({type: "REQUEST_MIGRATION_DATA"}, OLD_ORIGIN);
},3000)
window.addEventListener('message', onMessage);
// 等 iframe 加载完成再发请求
iframe.onload = () => {
iframe.contentWindow.postMessage({type: 'REQUEST_MIGRATION_DATA'}, OLD_ORIGIN);
};
document.body.appendChild(iframe);
});
}
if (location.href === 'https://typewords.cc/') {
window.addEventListener("DOMContentLoaded", () => {
// 3⃣ 自动执行迁移(只执行一次)
(async () => {
// 避免重复迁移
if (localStorage.getItem("__migrated_from_2study_top__")) {
console.log("数据已迁移过");
return;
}
if (localStorage.getItem('__migrated_from_2study_top__')) return;
console.log("开始从旧域名迁移数据…");
console.log('开始从旧域名迁移数据…');
try {
await migrateFromOldSite();
localStorage.setItem("__migrated_from_2study_top__", "1");
console.log("迁移完成");
localStorage.setItem('__migrated_from_2study_top__', '1');
console.log('迁移完成');
} catch (e) {
console.error("迁移失败", e);
console.error('迁移失败', e);
}
})();
});