From 7a4477966dbd7d9c98d4317de0321d544fc176dd Mon Sep 17 00:00:00 2001 From: Ironsp <1522278303@qq.com> Date: Wed, 9 Sep 2026 17:18:25 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/service/index.ts | 19 +++--- src/utils/sqlite.ts | 68 ++++++++++++++++--- ....timestamp-1788943664167-e7e01738caae4.mjs | 46 +++++++++++++ 3 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 vite.config.ts.timestamp-1788943664167-e7e01738caae4.mjs diff --git a/src/service/index.ts b/src/service/index.ts index fd9ae0f..52438cc 100644 --- a/src/service/index.ts +++ b/src/service/index.ts @@ -1,6 +1,4 @@ import DB from '@/utils/sqlite' - -// 导入可删但爆红, 可正常运行 import { projectTableSql } from './project' import { rtkTrackTableSql } from './rtkTrack' import { warningRecordTableSql } from './warningRecord' @@ -11,19 +9,20 @@ export { rtkTrackTableSql } from './rtkTrack' export { warningRecordTableSql } from './warningRecord' export { workRecordTableSql } from './workRecord' +const tableSqls = [ + projectTableSql, + workRecordTableSql, + rtkTrackTableSql, + warningRecordTableSql, +] + /** * 初始化数据库 */ export async function initTables() { - const sqls = [ - projectTableSql, - workRecordTableSql, - rtkTrackTableSql, - warningRecordTableSql, - ] - try { - await DB.transaction(sqls) + console.log('开始初始化数据库表...') + await DB.transaction(tableSqls) console.log('数据库表初始化成功') } catch (err) { diff --git a/src/utils/sqlite.ts b/src/utils/sqlite.ts index 8239563..34f89e5 100644 --- a/src/utils/sqlite.ts +++ b/src/utils/sqlite.ts @@ -72,8 +72,16 @@ class DB { resolve() }, fail(err: any) { - console.error('数据库打开失败:', err) - reject(err) + // -1402: Same Name Already Open,数据库已打开则视为成功 + if (err?.code === -1402) { + console.log('数据库已打开,跳过') + isOpen = true + resolve() + } + else { + console.error('数据库打开失败:', err) + reject(err) + } }, }) }) @@ -147,25 +155,65 @@ class DB { } /** - * 执行事务 + * 执行事务(BEGIN → SQLs → COMMIT,失败自动 ROLLBACK) */ - static transaction(sqls: string[]): Promise { - return DB.open().then(() => { - return new Promise((resolve, reject) => { + static async transaction(sqls: string[]): Promise { + await DB.open() + + // 开启事务 + await new Promise((resolve, reject) => { + plus.sqlite.transaction({ + name: DB_NAME, + operation: 'begin', + success() { + resolve() + }, + fail(err: any) { + console.error('开启事务失败:', err) + reject(err) + }, + }) + }) + + try { + // 逐条执行 SQL + for (const sql of sqls) { + await DB.executeSql(sql) + } + + // 提交事务 + await new Promise((resolve, reject) => { plus.sqlite.transaction({ name: DB_NAME, - sql: sqls, + operation: 'commit', success() { - console.log('事务执行成功') + console.log('事务提交成功') resolve() }, fail(err: any) { - console.error('事务执行失败:', err) + console.error('提交事务失败:', err) reject(err) }, }) }) - }) + } + catch (err) { + // 回滚事务 + await new Promise((resolve) => { + plus.sqlite.transaction({ + name: DB_NAME, + operation: 'rollback', + success() { + console.log('事务回滚成功') + resolve() + }, + fail() { + resolve() + }, + }) + }) + throw err + } } // ======================== CRUD 封装方法 ======================== diff --git a/vite.config.ts.timestamp-1788943664167-e7e01738caae4.mjs b/vite.config.ts.timestamp-1788943664167-e7e01738caae4.mjs new file mode 100644 index 0000000..21be885 --- /dev/null +++ b/vite.config.ts.timestamp-1788943664167-e7e01738caae4.mjs @@ -0,0 +1,46 @@ +// vite.config.ts +import Uni from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/@uni-helper+plugin-uni@0.1.0_@dcloudio+vite-plugin-uni@3.0.0-4080720251210001_@vueuse+core@13_le5bumlafdzre2on4j245qmxce/node_modules/@uni-helper/plugin-uni/src/index.js"; +import UniHelperComponents from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/@uni-helper+vite-plugin-uni-components@0.2.3_rollup@4.59.0/node_modules/@uni-helper/vite-plugin-uni-components/dist/index.mjs"; +import UniHelperLayouts from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/@uni-helper+vite-plugin-uni-layouts@0.1.11_rollup@4.59.0/node_modules/@uni-helper/vite-plugin-uni-layouts/dist/index.mjs"; +import UniHelperManifest from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/@uni-helper+vite-plugin-uni-manifest@0.2.9_vite@5.2.8_@types+node@24.1.0_sass@1.103.1_terser@5.37.0_/node_modules/@uni-helper/vite-plugin-uni-manifest/dist/index.mjs"; +import UniHelperPages from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/@uni-helper+vite-plugin-uni-pages@0.3.19_vite@5.2.8_@types+node@24.1.0_sass@1.103.1_terser@5.37.0_/node_modules/@uni-helper/vite-plugin-uni-pages/dist/index.mjs"; +import { UniEchartsResolver } from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/uni-echarts@2.5.2_echarts@6.1.0_vue@3.4.21_typescript@5.8.3_/node_modules/uni-echarts/dist-resolver/index.mjs"; +import UnoCSS from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/unocss@66.0.0_postcss@8.5.6_vite@5.2.8_@types+node@24.1.0_sass@1.103.1_terser@5.37.0__vue@3.4.21_typescript@5.8.3_/node_modules/unocss/dist/vite.mjs"; +import AutoImport from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/unplugin-auto-import@19.3.0_@vueuse+core@13.5.0_vue@3.4.21_typescript@5.8.3__/node_modules/unplugin-auto-import/dist/vite.js"; +import { defineConfig } from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/vite@5.2.8_@types+node@24.1.0_sass@1.103.1_terser@5.37.0/node_modules/vite/dist/node/index.js"; +import UniPolyfill from "file:///C:/Users/Administrator/Desktop/work/Road_roller/node_modules/.pnpm/vite-plugin-uni-polyfill@0.1.0/node_modules/vite-plugin-uni-polyfill/dist/index.mjs"; +var vite_config_default = defineConfig({ + plugins: [ + // https://uni-helper.js.org/vite-plugin-uni-manifest + UniHelperManifest(), + // https://uni-helper.js.org/vite-plugin-uni-pages + UniHelperPages({ + dts: "src/uni-pages.d.ts" + }), + // https://uni-helper.js.org/vite-plugin-uni-layouts + UniHelperLayouts(), + // https://uni-helper.js.org/vite-plugin-uni-components + UniHelperComponents({ + dts: "src/components.d.ts", + directoryAsNamespace: true, + resolvers: [UniEchartsResolver()] + }), + // https://uni-helper.js.org/plugin-uni + Uni(), + UniPolyfill(), + // https://github.com/antfu/unplugin-auto-import + AutoImport({ + imports: ["vue", "@vueuse/core", "uni-app"], + dts: "src/auto-imports.d.ts", + dirs: ["src/composables", "src/stores", "src/utils"], + vueTemplate: true + }), + // https://github.com/antfu/unocss + // see unocss.config.ts for config + UnoCSS() + ] +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxBZG1pbmlzdHJhdG9yXFxcXERlc2t0b3BcXFxcd29ya1xcXFxSb2FkX3JvbGxlclwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQWRtaW5pc3RyYXRvclxcXFxEZXNrdG9wXFxcXHdvcmtcXFxcUm9hZF9yb2xsZXJcXFxcdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL0FkbWluaXN0cmF0b3IvRGVza3RvcC93b3JrL1JvYWRfcm9sbGVyL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IFVuaSBmcm9tICdAdW5pLWhlbHBlci9wbHVnaW4tdW5pJ1xuaW1wb3J0IFVuaUhlbHBlckNvbXBvbmVudHMgZnJvbSAnQHVuaS1oZWxwZXIvdml0ZS1wbHVnaW4tdW5pLWNvbXBvbmVudHMnXG5pbXBvcnQgVW5pSGVscGVyTGF5b3V0cyBmcm9tICdAdW5pLWhlbHBlci92aXRlLXBsdWdpbi11bmktbGF5b3V0cydcbmltcG9ydCBVbmlIZWxwZXJNYW5pZmVzdCBmcm9tICdAdW5pLWhlbHBlci92aXRlLXBsdWdpbi11bmktbWFuaWZlc3QnXG5pbXBvcnQgVW5pSGVscGVyUGFnZXMgZnJvbSAnQHVuaS1oZWxwZXIvdml0ZS1wbHVnaW4tdW5pLXBhZ2VzJ1xuaW1wb3J0IHsgVW5pRWNoYXJ0c1Jlc29sdmVyIH0gZnJvbSAndW5pLWVjaGFydHMvcmVzb2x2ZXInXG5pbXBvcnQgVW5vQ1NTIGZyb20gJ3Vub2Nzcy92aXRlJ1xuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSAndW5wbHVnaW4tYXV0by1pbXBvcnQvdml0ZSdcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnXG5pbXBvcnQgVW5pUG9seWZpbGwgZnJvbSAndml0ZS1wbHVnaW4tdW5pLXBvbHlmaWxsJ1xuXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcGx1Z2luczogW1xuICAgIC8vIGh0dHBzOi8vdW5pLWhlbHBlci5qcy5vcmcvdml0ZS1wbHVnaW4tdW5pLW1hbmlmZXN0XG4gICAgVW5pSGVscGVyTWFuaWZlc3QoKSxcbiAgICAvLyBodHRwczovL3VuaS1oZWxwZXIuanMub3JnL3ZpdGUtcGx1Z2luLXVuaS1wYWdlc1xuICAgIFVuaUhlbHBlclBhZ2VzKHtcbiAgICAgIGR0czogJ3NyYy91bmktcGFnZXMuZC50cycsXG4gICAgfSksXG4gICAgLy8gaHR0cHM6Ly91bmktaGVscGVyLmpzLm9yZy92aXRlLXBsdWdpbi11bmktbGF5b3V0c1xuICAgIFVuaUhlbHBlckxheW91dHMoKSxcbiAgICAvLyBodHRwczovL3VuaS1oZWxwZXIuanMub3JnL3ZpdGUtcGx1Z2luLXVuaS1jb21wb25lbnRzXG4gICAgVW5pSGVscGVyQ29tcG9uZW50cyh7XG4gICAgICBkdHM6ICdzcmMvY29tcG9uZW50cy5kLnRzJyxcbiAgICAgIGRpcmVjdG9yeUFzTmFtZXNwYWNlOiB0cnVlLFxuICAgICAgcmVzb2x2ZXJzOiBbVW5pRWNoYXJ0c1Jlc29sdmVyKCldLFxuICAgIH0pLFxuICAgIC8vIGh0dHBzOi8vdW5pLWhlbHBlci5qcy5vcmcvcGx1Z2luLXVuaVxuICAgIFVuaSgpLFxuICAgIFVuaVBvbHlmaWxsKCksXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudGZ1L3VucGx1Z2luLWF1dG8taW1wb3J0XG4gICAgQXV0b0ltcG9ydCh7XG4gICAgICBpbXBvcnRzOiBbJ3Z1ZScsICdAdnVldXNlL2NvcmUnLCAndW5pLWFwcCddLFxuICAgICAgZHRzOiAnc3JjL2F1dG8taW1wb3J0cy5kLnRzJyxcbiAgICAgIGRpcnM6IFsnc3JjL2NvbXBvc2FibGVzJywgJ3NyYy9zdG9yZXMnLCAnc3JjL3V0aWxzJ10sXG4gICAgICB2dWVUZW1wbGF0ZTogdHJ1ZSxcbiAgICB9KSxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50ZnUvdW5vY3NzXG4gICAgLy8gc2VlIHVub2Nzcy5jb25maWcudHMgZm9yIGNvbmZpZ1xuICAgIFVub0NTUygpLFxuICBdLFxufSlcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBMlUsT0FBTyxTQUFTO0FBQzNWLE9BQU8seUJBQXlCO0FBQ2hDLE9BQU8sc0JBQXNCO0FBQzdCLE9BQU8sdUJBQXVCO0FBQzlCLE9BQU8sb0JBQW9CO0FBQzNCLFNBQVMsMEJBQTBCO0FBQ25DLE9BQU8sWUFBWTtBQUNuQixPQUFPLGdCQUFnQjtBQUN2QixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLGlCQUFpQjtBQUd4QixJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMxQixTQUFTO0FBQUE7QUFBQSxJQUVQLGtCQUFrQjtBQUFBO0FBQUEsSUFFbEIsZUFBZTtBQUFBLE1BQ2IsS0FBSztBQUFBLElBQ1AsQ0FBQztBQUFBO0FBQUEsSUFFRCxpQkFBaUI7QUFBQTtBQUFBLElBRWpCLG9CQUFvQjtBQUFBLE1BQ2xCLEtBQUs7QUFBQSxNQUNMLHNCQUFzQjtBQUFBLE1BQ3RCLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztBQUFBLElBQ2xDLENBQUM7QUFBQTtBQUFBLElBRUQsSUFBSTtBQUFBLElBQ0osWUFBWTtBQUFBO0FBQUEsSUFFWixXQUFXO0FBQUEsTUFDVCxTQUFTLENBQUMsT0FBTyxnQkFBZ0IsU0FBUztBQUFBLE1BQzFDLEtBQUs7QUFBQSxNQUNMLE1BQU0sQ0FBQyxtQkFBbUIsY0FBYyxXQUFXO0FBQUEsTUFDbkQsYUFBYTtBQUFBLElBQ2YsQ0FBQztBQUFBO0FBQUE7QUFBQSxJQUdELE9BQU87QUFBQSxFQUNUO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K