diff --git a/public/migrate.html b/public/migrate.html index 1e896896..0b746463 100644 --- a/public/migrate.html +++ b/public/migrate.html @@ -1,13 +1,25 @@ - - + + TypeWords 数据迁移 @@ -21,10 +33,40 @@ document.getElementById('log').textContent += msg + "\n"; } + let dbReadyPromise = null; + let name = 'keyval-store'; + + function openDB(dbName, keys) { + if (dbReadyPromise) return dbReadyPromise; + + dbReadyPromise = new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, 1); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + + keys.forEach((name) => { + if (!db.objectStoreNames.contains(name)) { + db.createObjectStore(name); + } + }); + }; + + request.onsuccess = () => resolve(request.result); + request.onerror = () => reject(request.error); + }); + + return dbReadyPromise; + } + + openDB(name) + // --- localStorage 读取 --- function readLocalStorageKeys(keys) { const out = {}; - keys.forEach(k => { out[k] = localStorage.getItem(k); }); + keys.forEach(k => { + out[k] = localStorage.getItem(k); + }); return out; } @@ -35,39 +77,36 @@ 'typing-word-setting', 'typing-word-files' ]) { - return new Promise((resolve) => { - const openReq = indexedDB.open(dbName); + return new Promise(async (resolve) => { + const db = await openDB(dbName, keys); + const stores = Array.from(db.objectStoreNames); - openReq.onerror = tryOpenKeyvalDefault; + if (stores.length === 0) { + db.close(); + tryOpenKeyvalDefault(); + return; + } - openReq.onsuccess = function () { - const db = openReq.result; - const stores = Array.from(db.objectStoreNames); - - if (stores.length === 0) { + if (stores.length === 1 && stores[0] === 'keyval') { + readFromKeyvalDB(db).then(result => { db.close(); - tryOpenKeyvalDefault(); - return; - } - - if (stores.length === 1 && stores[0] === 'keyval') { - readFromKeyvalDB(db).then(result => { - db.close(); resolve(result); - }); - } else { - readFromMultipleStores(db, stores).then(result => { - db.close(); resolve(result); - }); - } - }; + resolve(result); + }); + } else { + readFromMultipleStores(db, stores).then(result => { + db.close(); + resolve(result); + }); + } function tryOpenKeyvalDefault() { const req = indexedDB.open('keyval'); - req.onerror = () => resolve({ indexedDB: {}, reason: 'no-db' }); + req.onerror = () => resolve({indexedDB: {}, reason: 'no-db'}); req.onsuccess = function () { const db2 = req.result; readFromKeyvalDB(db2).then(result => { - db2.close(); resolve(result); + db2.close(); + resolve(result); }); }; } @@ -83,11 +122,11 @@ const r = store.get(k); r.onsuccess = () => { out[k] = r.result ?? null; - if (++finished === keys.length) res({ indexedDB: out }); + if (++finished === keys.length) res({indexedDB: out}); }; r.onerror = () => { out[k] = null; - if (++finished === keys.length) res({ indexedDB: out }); + if (++finished === keys.length) res({indexedDB: out}); }; }); }); @@ -105,15 +144,15 @@ req.onsuccess = () => { result[storeName] = req.result; - if (++count === stores.length) res({ indexedDB: result }); + if (++count === stores.length) res({indexedDB: result}); }; req.onerror = () => { result[storeName] = []; - if (++count === stores.length) res({ indexedDB: result }); + if (++count === stores.length) res({indexedDB: result}); }; } catch { result[storeName] = []; - if (++count === stores.length) res({ indexedDB: result }); + if (++count === stores.length) res({indexedDB: result}); } }); }); @@ -123,8 +162,8 @@ async function readAllStorageForMigration() { const local = readLocalStorageKeys(['PracticeSaveWord', 'PracticeSaveArticle']); - const indexed = await readIndexedDBCompatible('keyval-store'); - return { localStorage: local, indexedDB: indexed.indexedDB ?? {} }; + const indexed = await readIndexedDBCompatible(name); + return {localStorage: local, indexedDB: indexed.indexedDB ?? {}}; } // ===================== @@ -136,7 +175,7 @@ const data = await readAllStorageForMigration(); log('读取完成,开始发送数据到新域名'); - event.source.postMessage({ type: 'MIGRATE_DATA', payload: data }, event.origin); + event.source.postMessage({type: 'MIGRATE_DATA', payload: data}, event.origin); log('已发送迁移数据'); } diff --git a/public/static-home.html b/public/static-home.html index fe6bd0d4..38c85a20 100644 --- a/public/static-home.html +++ b/public/static-home.html @@ -426,32 +426,27 @@ }); } - // 自动启动迁移(只执行一次) - (async () => { - // 避免重复迁移 - if (localStorage.getItem("__migrated_from_2study_top__")) { - console.log("数据已迁移过"); - return; - } - - console.log("开始从旧域名迁移数据…"); - - try { - await migrateFromOldSite(); - localStorage.setItem("__migrated_from_2study_top__", "1"); - console.log("迁移完成"); - } catch (e) { - console.error("迁移失败", e); - } - })(); - if (location.href === 'https://typewords.cc/') { - document.onload = function () { - migrateFromOldDomain().then(() => { - console.log('数据迁移完成!'); - }); - } + window.addEventListener("DOMContentLoaded", () => { + (async () => { + // 避免重复迁移 + if (localStorage.getItem("__migrated_from_2study_top__")) { + console.log("数据已迁移过"); + return; + } + + console.log("开始从旧域名迁移数据…"); + + try { + await migrateFromOldSite(); + localStorage.setItem("__migrated_from_2study_top__", "1"); + console.log("迁移完成"); + } catch (e) { + console.error("迁移失败", e); + } + })(); + }); } diff --git a/src/App.vue b/src/App.vue index 8f22d5cb..0198f88d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -229,6 +229,29 @@ onMounted(() => { }; } + + // if (!OLD_ORIGIN){ + // var OLD_ORIGIN = "https://2study.top"; + // } + // // 创建隐藏 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; + // console.log('payload', payload) + // }); + // + // iframe.onload = function () { + // setTimeout(()=>{ + // iframe.contentWindow.postMessage({type: "REQUEST_MIGRATION_DATA"}, OLD_ORIGIN); + // },3000) + // }; + + // 使用示例(在老域名 2study.top 的控制台执行): // readAllStorageForMigration().then(result => { // console.log('读取到的数据:', result); @@ -237,6 +260,7 @@ onMounted(() => { // }); }) + // let transitionName = $ref('go') // const route = useRoute() // watch(() => route.path, (to, from) => {