重构数据库管理逻辑,新增旧数据库清理功能,优化数据库初始化流程,更新联系人管理和消息处理逻辑,提升代码可读性和用户体验。

This commit is contained in:
超级老白兔
2025-10-24 16:14:13 +08:00
parent e1d4f678ab
commit 28cbcea4f9
13 changed files with 278 additions and 561 deletions

View File

@@ -12,11 +12,90 @@ import { db } from "./utils/db"; // 引入数据库实例
// 设置dayjs为中文
dayjs.locale("zh-cn");
// 清理旧数据库
async function cleanupOldDatabase() {
try {
// 获取所有数据库
const databases = await indexedDB.databases();
for (const dbInfo of databases) {
if (dbInfo.name === "CunkebaoDatabase") {
console.log("检测到旧版数据库,开始清理...");
// 打开数据库检查版本
const openRequest = indexedDB.open(dbInfo.name);
await new Promise<void>((resolve, reject) => {
openRequest.onsuccess = async event => {
const database = (event.target as IDBOpenDBRequest).result;
const objectStoreNames = Array.from(database.objectStoreNames);
// 检查是否存在旧表
const hasOldTables = objectStoreNames.some(name =>
[
"kfUsers",
"weChatGroup",
"contracts",
"newContactList",
"messageList",
].includes(name),
);
if (hasOldTables) {
console.log("发现旧表,删除整个数据库:", objectStoreNames);
database.close();
// 删除整个数据库
const deleteRequest = indexedDB.deleteDatabase(dbInfo.name);
deleteRequest.onsuccess = () => {
console.log("旧数据库已删除");
resolve();
};
deleteRequest.onerror = () => {
console.error("删除旧数据库失败");
reject();
};
} else {
console.log("数据库结构正确,无需清理");
database.close();
resolve();
}
};
openRequest.onerror = () => {
console.error("无法打开数据库进行检查");
reject();
};
});
}
}
} catch (error) {
console.warn("清理旧数据库时出错(可忽略):", error);
}
}
// 数据库初始化
async function initializeApp() {
// 确保数据库已打开
await db.open();
console.log("数据库初始化成功");
try {
// 1. 清理旧数据库
await cleanupOldDatabase();
// 2. 打开新数据库
await db.open();
console.log("数据库初始化成功");
// 3. 开发环境清空数据(可选)
if (process.env.NODE_ENV === "development") {
console.log("开发环境:跳过数据清理");
// 如需清空数据,取消下面的注释
// await db.chatSessions.clear();
// await db.contactsUnified.clear();
// await db.contactLabelMap.clear();
// await db.userLoginRecords.clear();
}
} catch (error) {
console.error("数据库初始化失败:", error);
}
// 渲染应用
const root = createRoot(document.getElementById("root")!);