From a92732310ef57deca0b1fb09dfc14fb34ee308b4 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 10 Mar 2025 19:35:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=B5=84=E6=BA=90=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/services/database/database.dart | 26 +++++--- lib/common/utils/app/app_file_tool.dart | 52 +++++++++++++--- lib/common/utils/app/control/app_control.dart | 5 ++ lib/common/values/constants.dart | 4 ++ lib/pages/setting/controller.dart | 23 +++++++ lib/pages/setting/widgets/setting_backup.dart | 61 ++++++++++--------- 6 files changed, 124 insertions(+), 47 deletions(-) diff --git a/lib/common/services/database/database.dart b/lib/common/services/database/database.dart index 5aed5ba..a9b49ba 100644 --- a/lib/common/services/database/database.dart +++ b/lib/common/services/database/database.dart @@ -43,14 +43,22 @@ abstract class AppDatabase extends FloorDatabase { SettingDao get getSettingDao; static Future getDataBase() async { - final dbPath = await AppFileTool.getDatabasePath(); - return await $FloorAppDatabase.databaseBuilder("cash_register.db").build(); + final dataBase = await $FloorAppDatabase + .databaseBuilder(Constants.databaseName) + .addCallback( + Callback( + onCreate: (database, version) async { + logger.i('数据库已创建,版本: $version'); + }, + onOpen: (database) async { + logger.i('数据库已打开'); + }, + onUpgrade: (database, startVersion, endVersion) { + logger.i('数据库已升级,版本: $startVersion -> $endVersion'); + }, + ), + ) + .addMigrations([]).build(); + return dataBase; } - - // static Future getDataBase() async { - // final dbPath = await AppFileTool.getDatabasePath(); - // return await $FloorAppDatabase - // .databaseBuilder("$dbPath/cash_register.db") - // .addMigrations([]).build(); - // } } diff --git a/lib/common/utils/app/app_file_tool.dart b/lib/common/utils/app/app_file_tool.dart index 5febfbe..ea82e12 100644 --- a/lib/common/utils/app/app_file_tool.dart +++ b/lib/common/utils/app/app_file_tool.dart @@ -1,9 +1,9 @@ import 'dart:io'; +import 'package:common_utils/common_utils.dart'; import 'package:external_path/external_path.dart'; -import 'package:pj_supermarket_cloud/common/index.dart'; -import 'package:pj_supermarket_cloud/common/utils/index.dart'; +import 'package:pj_supermarket_cloud/common/index.dart'; abstract class AppFileTool { static const _tag = "app文件工具"; @@ -40,16 +40,29 @@ abstract class AppFileTool { /// 创建数据库文件地址 static Future getDatabasePath() async { - final backupDir = await getExternalPath( - backupExternalPath: false, - ); - return _checkAndcreateDir("$backupDir/$_backupDatabaseDir"); + final appSetting = await AppSettingTool.getSysSetting(); + return appSetting.sqlAddress; + } + + /// 保存数据库文件地址 + static Future setDatabasePath(String sqlAddress) async { + final appSetting = await AppSettingTool.getSysSetting(); + appSetting.sqlAddress = sqlAddress; + await AppSettingTool.setSysSetting(appSetting); } /// 创建数据库文件备份地址 static Future getDatabaseBackupPath() async { - final backupDir = await getExternalPath(); - return _checkAndcreateDir("$backupDir/$_baseBackupDir/$_backupDatabaseDir"); + String backupDir = await getExternalPath(); + String dir = "$backupDir/$_baseBackupDir/$_backupDatabaseDir"; + DateTime now = DateTime.now(); + int year = now.year; + int month = now.month; + int day = now.day; + dir = "$dir/$year-$month"; + dir = await _checkAndcreateDir(backupDir); + dir = "$dir/$day.db"; + return dir; } /// 创建日志地址 @@ -83,4 +96,27 @@ abstract class AppFileTool { final backupDir = await getExternalPath(); return _checkAndcreateDir("$backupDir/$_baseBackupDir/$_backupFaceDir"); } + + // 备份数据库 + static Future backupSqlFile() async { + final sourcePath = await getDatabasePath(); + if (ObjectUtil.isEmpty(sourcePath)) { + logger.e("|$_tag|备份sql文件失败,无效的sourcePath路径path:|$sourcePath|"); + return false; + } + String? backupPath = await getDatabaseBackupPath(); + if (ObjectUtil.isEmpty(backupPath)) { + logger.e("|$_tag|备份sql文件失败,无效的backupPath路径path:|$backupPath|"); + return false; + } + try { + await File("$sourcePath/${Constants.databaseName}").copy(backupPath!); + return true; + } catch (e, stack) { + logger.e("|$_tag|备份sql文件失败,意外的错误error|$e|stack|$stack|"); + return false; + } + } + + // 备份日志 } diff --git a/lib/common/utils/app/control/app_control.dart b/lib/common/utils/app/control/app_control.dart index e03fddf..0980fb5 100644 --- a/lib/common/utils/app/control/app_control.dart +++ b/lib/common/utils/app/control/app_control.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:event_bus/event_bus.dart'; import 'package:get/get.dart'; +import 'package:sqflite/sqflite.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; @@ -49,6 +50,10 @@ class AppControl extends GetxController { serialCardManage = SerialCardManage(); srialSteelyardManage = SerialSteelyardManage(); AppNetworkTool.listenNetwork(); + await AppFileTool.setDatabasePath( + await getDatabasesPath(), + ); + await AppFileTool.backupSqlFile(); Get.offAllNamed(RouteNames.login); } } diff --git a/lib/common/values/constants.dart b/lib/common/values/constants.dart index 5de9b4f..1308635 100644 --- a/lib/common/values/constants.dart +++ b/lib/common/values/constants.dart @@ -17,5 +17,9 @@ class Constants { /// 静态资源 url static const ossUrl = apiUrl; + /// ttl android 插件方法管道 static const localTTSPlugsMethodChannel = 'local/tts'; + + /// 数据库名字 + static const databaseName = 'cash_register.db'; } diff --git a/lib/pages/setting/controller.dart b/lib/pages/setting/controller.dart index ba90a9a..d985d48 100644 --- a/lib/pages/setting/controller.dart +++ b/lib/pages/setting/controller.dart @@ -199,6 +199,29 @@ class SettingController extends GetxController { } } + // 备份sql + void backupsSql() async { + EasyLoading.show( + status: '备份中...', + maskType: EasyLoadingMaskType.black, + ); + try { + final bool = await AppFileTool.backupSqlFile(); + if (!bool) throw Error(); + EasyLoading.dismiss(); + Toast.success(msg: "备份中sql成功"); + EasyLoading.dismiss(); + } catch (e) { + Toast.error(msg: "备份中sql失败"); + EasyLoading.dismiss(); + } + } + + // 备份日志 + void backupsLog() async { + Toast.success(msg: "当前日志为实时备份"); + } + Future getSetting() async { sysSetting.value = await AppSettingTool.getSysSetting(); userSetting.value = await AppSettingTool.getUserSetting(); diff --git a/lib/pages/setting/widgets/setting_backup.dart b/lib/pages/setting/widgets/setting_backup.dart index 5ecda61..42f1d35 100644 --- a/lib/pages/setting/widgets/setting_backup.dart +++ b/lib/pages/setting/widgets/setting_backup.dart @@ -1,37 +1,38 @@ import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; - import 'package:ducafe_ui_core/ducafe_ui_core.dart'; +import 'package:get/get.dart'; + import 'package:pj_supermarket_cloud/common/index.dart'; +import '../index.dart'; + Widget settingBackup(BuildContext context) { - return FutureBuilder( - future: AppSettingTool.getSysSetting(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const SizedBox.shrink(); - } - final sys = snapshot.data!; - return [ - FTile( - prefixIcon: appPrefixIcon(context, FAssets.icons.user), - suffixIcon: appSuffixIcon(context, FAssets.icons.files), - title: appPrefixTitle(context, "备份路径"), - details: appSuffixTitle(context, sys.externalPath), - onPress: () => KeywordTool.copy(sys.sysType.cnStr), - ), - FTile( - prefixIcon: appPrefixIcon(context, FAssets.icons.user), - suffixIcon: appSuffixIcon(context, FAssets.icons.folderSync), - title: appPrefixTitle(context, "sql备份"), - onPress: () => KeywordTool.copy(sys.sysType.cnStr), - ), - FTile( - prefixIcon: appPrefixIcon(context, FAssets.icons.user), - suffixIcon: appSuffixIcon(context, FAssets.icons.folderSync), - title: appPrefixTitle(context, "log备份"), - onPress: () => KeywordTool.copy(sys.sysType.cnStr), - ), - ].toColumnSpace(space: 20.h); - }); + return GetBuilder(builder: (controller) { + return Obx(() { + final sys = controller.sysSetting.value; + if (sys == null) return const SizedBox.shrink(); + return [ + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.user), + suffixIcon: appSuffixIcon(context, FAssets.icons.files), + title: appPrefixTitle(context, "备份路径"), + details: appSuffixTitle(context, sys.externalPath), + onPress: () => KeywordTool.copy(sys.sysType.cnStr), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.user), + suffixIcon: appSuffixIcon(context, FAssets.icons.folderSync), + title: appPrefixTitle(context, "sql备份"), + onPress: () => controller.backupsSql(), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.user), + suffixIcon: appSuffixIcon(context, FAssets.icons.folderSync), + title: appPrefixTitle(context, "log备份"), + onPress: () => controller.backupsLog(), + ), + ].toColumnSpace(space: 20.h); + }); + }); }