diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts index a594cad..638cbbf 100644 --- a/src/auto-imports.d.ts +++ b/src/auto-imports.d.ts @@ -122,6 +122,7 @@ declare global { const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] const saveDeviceInfo: typeof import('./utils/device')['saveDeviceInfo'] const selectSql: typeof import('./utils/sqlite')['selectSql'] + const setDbInitPromise: typeof import('./utils/sqlite')['setDbInitPromise'] const shallowReactive: typeof import('vue')['shallowReactive'] const shallowReadonly: typeof import('vue')['shallowReadonly'] const shallowRef: typeof import('vue')['shallowRef'] @@ -468,6 +469,7 @@ declare module 'vue' { readonly resolveUnref: UnwrapRef readonly saveDeviceInfo: UnwrapRef readonly selectSql: UnwrapRef + readonly setDbInitPromise: UnwrapRef readonly shallowReactive: UnwrapRef readonly shallowReadonly: UnwrapRef readonly shallowRef: UnwrapRef diff --git a/src/components/home/homeNav.vue b/src/components/home/homeNav.vue index 2c6b089..59394e4 100644 --- a/src/components/home/homeNav.vue +++ b/src/components/home/homeNav.vue @@ -36,10 +36,10 @@ function onIconClick(name: string) { - {{ project?.project_name || '未设置项目' }} + {{ project?.project_name || '-----' }} - {{ project?.stake_range || '--' }} + {{ project?.stake_range || '-----' }} diff --git a/src/pages.json b/src/pages.json index 74de8fa..ba16222 100644 --- a/src/pages.json +++ b/src/pages.json @@ -16,6 +16,7 @@ "navigationBarTitleText": "Road-Roller" }, "pages": [ + // GENERATED BY UNI-PAGES, PLATFORM: APP { "path": "pages/Ahome/index", "type": "home", @@ -120,6 +121,7 @@ "color": "@tabFontColor", "selectedColor": "@tabSelectedColor", "list": [ + // GENERATED BY UNI-PAGES, PLATFORM: APP { "pagePath": "pages/Ahome/index", "text": "首页", diff --git a/src/service/index.ts b/src/service/index.ts index 6bf56c3..0213576 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -1,4 +1,4 @@ -import DB from '@/utils/sqlite' +import DB, { setDbInitPromise } from '@/utils/sqlite' import { historyReportTableSql } from './historyReport' import { projectTableSql } from './project' import { rtkTrackTableSql } from './rtkTrack' @@ -77,20 +77,29 @@ async function resetDatabase() { * 初始化数据库(建表 → 结构校验/重建 → 空表灌假数据) */ export async function initTables() { - try { - console.log('开始初始化数据库表...') - await DB.transaction(tableSqls) + // 先打开数据库,确保后续 DB.open() 走 isOpen 快速路径,不等 initPromise(避免死锁) + await DB.open() - if (await isSchemaOutdated()) { - await resetDatabase() - return + // 立即设置 initPromise,让其他并发的 DB 操作等待 + const promise = (async () => { + try { + console.log('开始初始化数据库表...') + await DB.transaction(tableSqls) + + if (await isSchemaOutdated()) { + await resetDatabase() + return + } + + console.log('数据库表初始化成功') + await seedIfNeeded() } + catch (err) { + console.error('数据库表初始化失败:', err) + throw err + } + })() - console.log('数据库表初始化成功') - await seedIfNeeded() - } - catch (err) { - console.error('数据库表初始化失败:', err) - throw err - } + setDbInitPromise(promise) + return promise } diff --git a/src/utils/sqlite.ts b/src/utils/sqlite.ts index 1e8943a..3714b23 100644 --- a/src/utils/sqlite.ts +++ b/src/utils/sqlite.ts @@ -36,6 +36,26 @@ const DB_PATH = '_doc/road_roller.db' let isOpen = false +/** + * 数据库初始化 Promise,确保在表创建完成前不执行查询 + * initTables() 设置此 Promise,DB.open() 会等待它完成 + */ +let initPromise: Promise | null = null + +/** + * 注册数据库初始化 Promise(由 initTables 调用) + */ +export function setDbInitPromise(promise: Promise) { + initPromise = promise +} + +/** + * 等待数据库初始化完成 + */ +function waitForInit(): Promise { + return initPromise ?? Promise.resolve() +} + /** * 转义 SQL 字符串值,防止单引号注入 */ @@ -57,32 +77,39 @@ class DB { * 打开数据库 */ static open(): Promise { - return new Promise((resolve, reject) => { - if (isOpen) { - resolve() - return - } + // 已打开则直接返回,避免与 initPromise 产生死锁 + if (isOpen) { + return Promise.resolve() + } - plus.sqlite.openDatabase({ - name: DB_NAME, - path: DB_PATH, - success() { - console.log('数据库打开成功') - isOpen = true + return waitForInit().then(() => { + return new Promise((resolve, reject) => { + if (isOpen) { resolve() - }, - fail(err: any) { - // -1402: Same Name Already Open,数据库已打开则视为成功 - if (err?.code === -1402) { - console.log('数据库已打开,跳过') + return + } + + plus.sqlite.openDatabase({ + name: DB_NAME, + path: DB_PATH, + success() { + console.log('数据库打开成功') isOpen = true resolve() - } - else { - console.error('数据库打开失败:', err) - reject(err) - } - }, + }, + fail(err: any) { + // -1402: Same Name Already Open,数据库已打开则视为成功 + if (err?.code === -1402) { + console.log('数据库已打开,跳过') + isOpen = true + resolve() + } + else { + console.error('数据库打开失败:', err) + reject(err) + } + }, + }) }) }) } @@ -114,13 +141,14 @@ class DB { /** * 执行 SQL 语句(增、删、改) + * sql 可以是单条语句(string)或多条语句(string[]) */ - static executeSql(sql: string[]): Promise { + static executeSql(sql: string | string[]): Promise { return DB.open().then(() => { return new Promise((resolve, reject) => { plus.sqlite.executeSql({ name: DB_NAME, - sql, + sql: sql as any, // plus.sqlite 实际支持 string | string[],TS 声明不完整 success(res: any) { resolve(res) },